У меня есть задача с бесконечными списками.
Я должен написать zipWith/3 для бесконечных списков - готово
Я должен использовать этот zipWith/3 для создания бесконечного списка чисел фибоначчи с fib/0 - проблема
Мне нужно написать fibs(N), взяв первые N элементов из fib() - готово
Это то, что у меня есть до сих пор:
-module(zipWith).
-export([take/2, zipWith/3, fib/0]).
take(0, _) -> [];
take(N, [H|LazyT]) -> [H | take(N-1, LazyT())].
zipWith(F, [H1|L1], [H2|L2]) -> [F(H1, H2) | fun() -> zipWith(F, L1(), L2()) end].
fib() -> ...
fib(L) -> zipWith(fun(X,Y) -> X + Y end, L(), tl(L())).
fibs(N) -> take(N, fib()).
Я знаю, что fib/1 должна выглядеть так (я почти уверен — поправьте меня, если я ошибаюсь). Берем сам список и список без головы. Таким образом, в случае [0,1,...] zipWith(add,[0,1,...],[1,...]) приводит к добавлению двух последних чисел. Но что бы я ни пробовал в качестве начала этого fib()->..., это приводит к ошибкам. Я хочу выразить это как-то так: fib() -> fib([[0,1] ++ fun() -> ... end]...)
Я как-то хотел начать fib/1 с [0,1,fun()...], но не понимаю, как начать список.
Заранее спасибо за совет