Уведомления

Группа в Telegram: присоединиться

#1 Март 24, 2019 15:00:38

MoJoVi
Зарегистрирован: 2019-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите найти ошибку

Начал пытаться решать задачи из проекта эйлера, и на второй уже возникла у меня трудность. Задача звучит так:
Каждый следующий элемент ряда Фибоначчи получается при сложении двух предыдущих. Начиная с 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”
Подскажите возможно ли реализовать код верно в таком формате, а если нет - то укажите почему.(Только не пишите готовое решение, сам буду думать)

Отредактировано MoJoVi (Март 25, 2019 07:17:21)

Офлайн

#2 Март 24, 2019 21:20:30

Yuri197
Зарегистрирован: 2019-03-24
Сообщения: 14
Репутация: +  0  -
Профиль  

помогите найти ошибку

#!/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. Могу выложить решение.

Отредактировано Yuri197 (Март 24, 2019 21:25:22)

Офлайн

#3 Март 25, 2019 07:00:35

MoJoVi
Зарегистрирован: 2019-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите найти ошибку

Yuri197
Если вы выполните ваш код так, то проблемы с глобальной переменной уже не будет. Другое дело, что и результата правильного не будет тоже. Насколько я понимаю, должно получиться число 4613732. Могу выложить решение.
Ну, проблема как была так и осталась, не изменилось ничего.
А ответ я при желании найти смогу, спасибо. Просто хочу понять почему данный способ не работает.
Сам код немного изменил в шапке, нашел неточность.

Отредактировано MoJoVi (Март 25, 2019 07:18:47)

Офлайн

#4 Март 25, 2019 08:06:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 6784
Репутация: +  464  -
Профиль   Отправить e-mail  

помогите найти ошибку

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)
как по вашему, будет изменяться шаг, если вы будете изменять глобальную переменную?



Офлайн

#5 Март 25, 2019 08:41:50

MoJoVi
Зарегистрирован: 2019-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите найти ошибку

FishHook
Ваша проблема в том, что это по вашей задумке шаг должен изменяться, а по задумке авторов языка - нет. Функция range вызывается ОДИН раз при инициализации цикла. Если бы она вызывалась КАЖДЫЙ РАЗ, то на каждой итерации вы бы получали начальное значение диапазона.
Спасибо за замечание, ошибку осознал обещаю исправиться.
FishHook
как по вашему, будет изменяться шаг, если вы будете изменять глобальную переменную?
Тут дело в том что я неверно понимал принцип действия функции range, я совсем недавно начал учить питон, еще только набираюсь знаний. Буду пробовать другой способ, еще раз спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version