#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)