Я написал следующую программу воспроизведения Фибоначчи как часть изучения Haskell:
fibonacci 0 = [0]
fibonacci 1 = [0,1]
fibonacci n = let
foo'1 = last (fibonacci (n-1))
foo'2 = last (fibonacci (n-2))
in reverse((foo'1 + foo'2):reverse (fibonacci (n-1)))
Программа работает:
ghci>fibonacci 6
[0,1,1,2,3,5,8]
Но производительность падает экспоненциально с n. Если я дам ему аргумент 30, он запустится примерно через минуту, в отличие от мгновенного запуска в 6. Кажется, ленивое выполнение сжигает меня, и фибоначчи запускается один раз для каждого элемента в окончательном списке.
Я делаю что-то глупое или что-то упускаю?
(Я уже избавился от ++, думая, что это может быть сделано)
reverseFib
, чтобы вернуть числа Фибоначчи в обратном направлении, так как это проще. Как только это будет определено, вы можете определитьfibonacci = reverse . reverseFib
, чтобы вы переворачивали список только один раз в конце. (Конечно, в Haskell есть и другие известные подходы, например, рекурсия по спискам вместо функций... но пока забудьте об этом) - person chi   schedule 29.12.2014