Значение последовательности Фибоначчи в haskell

как получить сумму последовательности фибоначчи, используя этот код:

fibs= 0 : 1 : zipWith (+) fibs (tail fibs)

редактировать: взять 5 фибов дает список [0,1,1,2,3], поэтому значение 5-го элемента равно 3, чтобы извлечь его, мы должны ввести: «последний (взять (5 фиб))», и мы получаем 3. И так далее

если мы используем интерпретатор для поиска 5-го элемента, мы получаем список из [0, 1, 2, 3], последний элемент такой же, какое значение 5-го элемента, как получить ПОСЛЕДНИЙ элемент этого списка? Могу ли я «сделать» это с помощью last , у вас есть какие-нибудь идеи, не так ли?


person Tom    schedule 10.05.2011    source источник
comment
let fiblist = 0:1 : (zipWith (+) fiblist (хвост fiblist)) in (last(взять 5 fiblist)) это то, что (я думаю) решает мою проблему. Например, для fiblist 5 я получаю 3 , для 15 - › 377, так что правильное значение элемента Фибоначчи Ну, это работает, но некрасиво;)   -  person Tom    schedule 11.05.2011
comment
Пожалуйста, отредактируйте свой вопрос, чтобы четко определить, чего вы пытаетесь достичь.   -  person Dan Burton    schedule 11.05.2011


Ответы (3)


Мне не совсем понятно, о чем вы спрашиваете, но если у вас есть непустой небесконечный (т. е. не fibs, а, например, take n fibs для какого-то n) список, вы действительно можете получить его последний элемент, применив last к этому. В качестве альтернативы, если вам просто нужен n-й элемент списка (начиная с нуля и предполагая, что список содержит не менее n+1 элементов), вы можете сделать listName !! n для его извлечения.

person jwodder    schedule 10.05.2011

Это определение дает бесконечный поток целых чисел. Нет последнего элемента.

Если вместо этого вы хотите проиндексировать определенный элемент из списка, вы можете сделать это с помощью оператора (!!):

> [1..] !! 7
8
person Don Stewart    schedule 10.05.2011

Ну, если вам просто нужен 10-й элемент списка:

last (take 10 fibs)

если вам нужна сумма первых 10 элементов:

sum (take 10 fibs)

Кстати, есть немного более простое выражение для fibs, использующее только рекурсию:

fibs = (fibgen 0 1) where fibgen a b = a : fibgen b (a+b)
person LazerOptyx    schedule 24.09.2015