2016-08-04 3 views
0

Я получаю ошибку «Максимальная ошибка рекурсии» при выполнении моей программы для решения этой проблемы. Проект Эйлера question #5 просит найти:RecursionError в Project Euler # 5

наименьшее положительное число, которое делится на все числа от 1 до 10.

Я пытался написать программу, которая рекурсивно проверяет, если x делится на каждое целое число 1-10, а если нет, то мы вызываем его снова с x с шагом 1 и повторяем до тех пор, пока не будет найдено x. (В этом случае ответ 2520, поэтому я добавил, если заявление.)

def euler5(x): 

    if x < 2521: 
     for i in range(1, 11): 
      if x % i == 0: 
       print(x) 

      else: 
       euler5(x+1) 

    else: 
     print(x) 


x = 2 
print(euler5(x)) 
+6

Почему вы используете рекурсию, а не петли? – Blorgbeard

+5

Если вы уже знаете ответ, зачем нужен код? :) При всей серьезности, однако, код должен работать без проверки предела, вот идея проблемы - найти номер –

ответ

4

Причина этого заключается в том, что Python (или CPython, по крайней мере) имеет ограниченный размер стека и не хвостовая оптимизация. Таким образом, вы не можете использовать неограниченную рекурсию в Python, в отличие от Схемы (например).

Решение использовать обычный цикл:

x = 0 
while True: 
    x += 1 
    # Put loop body here 
-1

В вы определили функцию, вы могли бы вы петлю, даже если вы не знаете, математические функции. Однако ваш код неэффективен, так как программа должна продолжать проверять значения, чтобы увидеть, соответствует ли это условию. Рекурсия не рекомендуется, так как она должна быть гибкой для использования с другими значениями не только для этого вопроса. Вопросы Эйлера предназначены для обучения вашей практике кодирования.

Лучший метод может быть использован для упрощения кода:

from functools import reduce 
from fractions import gcd 
def lcm(a,b): 
    return a*b//gcd(a,b) #gcd is greatest common divisor AKA HCF 

print (reduce(lcm, range(1, 20+1))) 
+1

Не думаете ли вы, что объяснение проблемы с кодом лучше, чем дать оптимальный ответ? –

+1

Это может быть включено. Позвольте мне отредактировать мой пост –

+1

Я буду утверждать, что проблемы Эйлера предназначены для проверки математического знания, а не для практики кода. Например, требуется кратное 2, поэтому вам не нужно перебирать отдельные цифры. Кроме того, даже не каждая другая цифра, поскольку требуется кратное 5. Аналогичные тесты можно использовать для других цифр. Это значительно увеличивает скорость кода. –