Найти - Пользователи
Полная версия: помогите найти ошибку
Начало » Центр помощи » помогите найти ошибку
1
MoJoVi
Начал пытаться решать задачи из проекта эйлера, и на второй уже возникла у меня трудность. Задача звучит так:
Каждый следующий элемент ряда Фибоначчи получается при сложении двух предыдущих. Начиная с 1 и 2, первые 10 элементов будут:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Найдите сумму всех четных элементов ряда Фибоначчи, которые не превышают четыре миллиона.

Я попробовал сделать так:
 x = 0
y = 1
for i in range(2, 4000000, y):
    if i % 2 == 0:
        x += i
    y += i
    if y % 2 == 0:
        x += y
print(x)
Но тут возникает проблема: не смотря на то, что шаг я установил на переменную y и по задумке при её изменении шаг тоже должен меняться, но шаг не изменяется и всегда равен 1, пробовал установить y переменную как глобальную внутри функции, но получаю ошибку:
“SyntaxError: name ‘y’ is used prior to global declaration”
Подскажите возможно ли реализовать код верно в таком формате, а если нет - то укажите почему.(Только не пишите готовое решение, сам буду думать)
Yuri197
#!/usr/bin/env python3
# -*- coding: utf-8 -*-


if __name__ == "__main__":
x = 2
y = 1
for i in range(2, 4000000, y):
y += i
if y % 2 == 0:
x += y
print(x)
Если вы выполните ваш код так, то проблемы с глобальной переменной уже не будет. Другое дело, что и результата правильного не будет тоже. Насколько я понимаю, должно получиться число 4613732. Могу выложить решение.
MoJoVi
Yuri197
Если вы выполните ваш код так, то проблемы с глобальной переменной уже не будет. Другое дело, что и результата правильного не будет тоже. Насколько я понимаю, должно получиться число 4613732. Могу выложить решение.
Ну, проблема как была так и осталась, не изменилось ничего.
А ответ я при желании найти смогу, спасибо. Просто хочу понять почему данный способ не работает.
Сам код немного изменил в шапке, нашел неточность.
FishHook
MoJoVi
по задумке при её изменении шаг тоже должен меняться, но шаг не изменяется и всегда равен 1

Ваша проблема в том, что это по вашей задумке шаг должен изменяться, а по задумке авторов языка - нет. Функция range вызывается ОДИН раз при инициализации цикла. Если бы она вызываласть КАЖДЫЙ РАЗ, то на каждой итерации вы бы получали начальное значение диапазона. range - это не магия, не шаманство, эту функцию вы можете реализовать самостоятельно, например, вот так.
 def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start = start + step
for i in my_range(1, 10, 2):
    print(i)
как по вашему, будет изменяться шаг, если вы будете изменять глобальную переменную?
MoJoVi
FishHook
Ваша проблема в том, что это по вашей задумке шаг должен изменяться, а по задумке авторов языка - нет. Функция range вызывается ОДИН раз при инициализации цикла. Если бы она вызывалась КАЖДЫЙ РАЗ, то на каждой итерации вы бы получали начальное значение диапазона.
Спасибо за замечание, ошибку осознал обещаю исправиться.
FishHook
как по вашему, будет изменяться шаг, если вы будете изменять глобальную переменную?
Тут дело в том что я неверно понимал принцип действия функции range, я совсем недавно начал учить питон, еще только набираюсь знаний. Буду пробовать другой способ, еще раз спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB