Помогите решить задачку со списком
Дана непустая последовательность натуральных чисел, за которой следует 0. Вычислить сумму тех из них, порядковые номера которых- числа Фибоначчи.
Вот что есть на данный момент:
our_list = [] # заводим пустой список
new_element = 1
while new_element != 0: # пока в списке не появится элемент "0"
new_element = int(input()) # считываем очередной элемент
our_list.append(new_element) # добавляем его в список
print(our_list) # выводим список
# ниже Фибоначчи
first_el = 0
second_el = 1
for i in range(len(our_list)): # выполняем столько раз сколько элементов в списке
i += 1 # прибавляем 1 к "i"
first_el, second_el = second_el, first_el + second_el # меняем местами значение и выполняем сложение
print(first_el)
Ответы (2 шт):
Можно как-то так:
first, second = 0, 1
while first < len(our_list):
print(our_list[first])
first, second = second, first+second
для такого списка:
our_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
выведет:
0
1
1
2
3
5
8
13
нужно только сумму посчитать:
result = 0
while first < len(our_list):
result += our_list[first]
# print(our_list[first])
first, second = second, first+second
print(result)
33
не верно прочитано условие, решение подходит для обратной задачи и ищет сумму индексов для числ Фибоначчи в списке
Тут мне кажется удобно было бы сделать проверку: является ли число из списка числом Фибоначчи?
Т. е. можно воспользоваться формулой Бине (фунция от n) и забрать оттуда определение для золотого сечения.

А, также следствия, что числом Фибоначчи является округление
и 
Фунция будет:
def is_fib(n):
phi = .5 + .5 * math.sqrt(5.0)
value = phi * n
return abs(round(value) - value) < 1 / n or n == 0
Ну, а затем проверять все числа последовательности и при значении True забирать порядковые номера и суммировать
result = 0
our_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
for value in our_list:
if is_fib(value):
result += our_list.index(value)
print(result)
Не забудьте подключить math
Сюда добавлю правильное решение
Основой стало отказаться от не нужного количества итераций, цикла while и правильность решения.
Итак, будем работать над следующим списком:
our_list =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0]
Мы можем отыскать индекс нулевого значения:
last_index = our_list.index(0)
>>> last_index
17
Следующая функция определяет ближайшее число Фибоначчи к заданному на вход:
def reverse_fib(value):
phi = .5 + .5 * math.sqrt(5.0)
if value < 2:
return value
return (int(round(log(value * 5 ** .5) / log(phi)))) # phi определено выше
reverse_fib(last_index)
>>> amount_fib = reverse_fib(last_index)
8
Напишем рекурсию для нахождения чисел Фибоначчи при заданном количестве членов n:
def fib(n):
if n == 0 or n == 1:
return n
else:
return fib(n - 1) + fib(n - 2)
Попробуем:
indexes = [fib(i) for i in range(amount_fib)]
>>> indexes
[0, 1, 1, 2, 3, 5, 8, 13]
А, теперь к нашему списку:
result = 0
for k in indexes:
result += our_list[k]
>>print(result)
41
возможно необходимо добавить обработку некоторых крайних значений, но логически вроде правильно