2016-03-22 3 views
-4

Я пишу основную функцию рекурсии, которая принимает целое число n и возвращает сумму первых n обратных. Ввод 2 должно привести к 1,5, и ввод 0 должен возвращать 0.Python 3 Рекурсия - максимальная глубина превышена

sum_to (2) = (1 + 1/2) = 1,5

Вот что у меня есть:

def sum_to(n): 
    if n>0: 
     return sum_to(1+1/n) # Not sure if this is correct 
    return 0 

Но все, что я получаю, - это максимальная глубина рекурсии. Я знаю, что могу перечислить списки, но рекурсия действительно интригующая, и я хочу найти решение, использующее его.

+0

«Не уверен, что это правильно». Согласно вашей программе sum_to (1) совпадает с 1 + sum_to (1). Вы не уверены, что это правильно? – Goyo

+0

это связано с вашим вопросом случайно? http://stackoverflow.com/questions/31323495/1-1-2-1-3-%C2%BC-finding-sum –

+0

Если вы продолжаете добавлять 1, n будет равным 0? – AJPennster

ответ

1

От вопроса, кажется, что вы хотите, чтобы вычислить

\sum_{i=1}^{n} 1/i 

Если вход 0, то возвращается 0.

Помните, что в рекурсивной функции, вам нужно определить базу дело и индуктивная статья.

В вашем вопросе, индуктивный оговорка:

1.0/i + sum_of_reciprocals(i-1) 

в то время как базовый вариант может быть установлен в 0 при i=0.

Учитывая эту формулировку, функция с примером выглядит следующим образом:

def sum_to(n): 
    if n > 0: 
     return sum_to(n-1) + 1.0/n 
    else: 
     return 0 

if __name__ == '__main__': 
    print(sum_to(3)) 

и результат +1,83333333333.

Для получения дополнительной информации о рекурсивных функциях вы можете начать с related wikipedia page.

+0

Большое спасибо. Короткий и лаконичный. Связанная страница wiki оценена, она, безусловно, поможет мне, когда я создам еще несколько рекурсий практики прямо сейчас. –

1

трассировки через него, чтобы увидеть, если вы когда-либо достичь вашего граничное условие:

(PS: в то время я написал этот код на вопрос был return 1 + sum_to(1/n))

sum_to(2): 
    n is 2, which is > 0 
    call sum_to(1/2) 
     n is .5, which is > 0 
     call sum_to(1/.5) 
      n is 2, which is > 0 
      call sum_to(1/2) 
... 

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

Для примера, просто написать так:

def sum_to(n): 
    return 1 + 1/n 

Что ожидаемый результат при п> 2? Это определит, как подойти к организации рабочего кода.

+0

Спасибо, я вижу ошибку сейчас. Ожидаемый результат должен быть суммой n обратных. ех. sum_to (2) = (1 + 1/2), где as sum_to (3) = (1 + 1/2 + 1/3). Моя ошибка за неправильное формулирование вопроса. Я в основном хочу найти обратные до такой степени, что обратный равен 1/n, и остановитесь там. –

+1

Итак, любой заданный термин в позиции 'x' имеет значение' 1/x'. Для первого слова '1/1 == 1', второго' 1/2', третьего '1/3'. Таким образом, вы хотите 'return 1/n + sum_to (n-1)', поскольку каждый член имеет следующую позицию. Это объясняется теперь лучше в ответе Альбертогля. – dsh

Смежные вопросы