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

#list #haskell #lazy-evaluation

#Список #haskell #отложенная оценка

Вопрос:

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

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

редактировать: take 5 fibs выдает список из [0,1,1,2,3], поэтому значение 5-го элемента равно 3, чтобы извлечь его, мы должны ввести: ‘last (take(5 fibs))’ и мы получим 3. И так далее

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

Комментарии:

1. пусть fiblist = 0: 1: (zipWith ( ) fiblist (tail fiblist)) в (last (возьмите 5 fiblist)) это то, что (я думаю) решает мою проблему, например, для fiblist 5 я получаю 3, для 15 -> 377, так что правильное значение элемента Фибоначчи Хорошо работает, но не очень;)

2. Пожалуйста, отредактируйте свой вопрос, чтобы четко определить, чего вы пытаетесь достичь.

Ответ №1:

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

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

 > [1..] !! 7
8
  

Ответ №2:

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

Ответ №3:

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

 last (take 10 fibs)
  

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

 sum (take 10 fibs)
  

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

 fibs = (fibgen 0 1) where fibgen a b = a : fibgen b (a b)