2016-06-13 3 views
0

Я относительно новичок в кодировании в целом и начал проект Euler, чтобы немного улучшить кодировку. Провел некоторое время, думая о том, как самостоятельно работать с первым вопросом и попытался использовать рекурсивные функции, к сожалению, всегда получая ту же ошибку (266333). Что я упустил? С какой большой ошибкой учиться?Project Euler - # 1 Неправильное решение Python

Оригинальный вопрос гласит: «Если мы все натуральные числа меньше 10, кратные 3 или 5, мы получаем 3, 5, 6 и 9. Сумма этих мультипликаторов составляет 23.

Найти сумма всех кратных 3 или 5 ниже 1000. "

def function(i, j, h, k): 
    if j < 1000 and k < 1000: 
     i = i + j 
     h = h + k 
     return function(i, j+3, h, k+5) 
    elif j < 1000 and k >= 1000: 
     i = i + j 
     return function(i, j+3, h, k) 
    elif j >= 1000 and k < 1000: 
     h = h + k 
     return function(i, j, h, k+5) 
    else: 
     print (i + h) 


function(0,0,0,0) 

Где я это сумма чисел, кратных 3, ч является суммой кратных 5, J является кратны 3 и к является кратны 5.

+0

Ваши общие имена переменных делают этот код очень трудным для понимания. Что означают 'i',' j', 'h' и' k'? – Blckknght

+0

Обязательно использовать рекурсию, не могли бы вы разместить ссылку на эту проблему? – wind85

ответ

1

Ваша ошибка состоит в том, что вы включая номера делится на 15 дважды: один раз, кратное 3, и один раз, кратное 5.

для чего это стоит, вот краткий способ вычисления этой суммы:

sum(i for i in range(1000) if not (i % 3 and i % 5)) 
+0

Да, теперь я получил правильный ответ, я решил его с помощью инструкции initial if для общих кратных. \t 'если J% 5 == 0: \t \t Функция возврата (I, J + 3, ч, к)' – Vaan616

0

Я настоятельно советую против r ecursion, поскольку он может работать для небольшого числа, но не для более крупных, и даже если решение может работать, это научит вас ошибочному подходу.

def euler_1(sum, range_beg, range_end): 
    for number in range(range_beg, range_end): 
     if ((number % 3) == 0) or ((number % 5) == 0): 
      sum += number 
     else: 
      pass 

    return sum 


print(euler_1(0, 0, 1000)) 

Это более pythonic, многоразовый, более быстрый и простой способ чтения и исправления.

+0

Это на самом деле гораздо проще для меня, чтобы понять, модуль полностью пропустил мой ум, когда начинает этот вопрос. Большое спасибо! – Vaan616