TL/DR Как вы оцениваете формулировки формы var += func(var, n-1)
?рекурсия формы var + = func (var, n-1)
Редактировать: «Оценивать» Я имею в виду, как определяется значение, указанное правой частью этого утверждения. В приведенной ниже функции var += func(var, n-1)
всегда приводит к sum += sum
. Но почему sum
всегда звонил? почему не sum += (n-1)
? Что определяет, какое значение вызывается правой стороной? С помощью нескольких ответов я думаю, что я понял это (см. Ниже), но больше света на эту тему всегда будет оценено. Я изучал программирование всего несколько дней.
I asked a question regarding a recursive function и получил ответ, на который я был доволен, но который поднял еще несколько вопросов. Я просматривал предыдущие вопросы по этой теме, но я все еще ничего не вижу. Похоже, что рекурсия - это фундаментальная концепция, которую нужно полностью понять, чтобы преуспеть в программировании, поэтому я хотел бы задавать вопросы, пока не выясню это. Отвечающий предложили другой пример функции для меня, чтобы созерцать:
def foo(sum, n):
if (n == 0):
return sum
sum += foo(sum, n-1)
sum /= 2
return foo(sum, n-1)
Я никогда не видел + = используется с функцией с несколькими аргументами, и я понятия не имею, как оценить это. Я добавил print(sum)
после sum += foo(sum, n-1)
и sum /= 2
, чтобы попытаться посмотреть, что происходит. Запуск foo(10, 3)
в результате:
20
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
я решил изменить +=
к *=
, чтобы увидеть, если это будет делать то, что происходило более ясным. Это та программа:
def foo(sum, n):
if (n == 0):
return sum
sum *= foo(sum, n-1)
print(sum)
sum /= 2
print(sum)
return foo(sum, n-1)
foo(10, 3)
Это произвело следующее:
100
50.0
500.0
250.0
62500.0
31250.0
312500.0
156250.0
24414062500.0
12207031250.0
1907348632812500.0
953674316406250.0
9.094947017729283e+29
4.5474735088646414e+29
можно проследить несколько различных переплетаются закономерности в этой продукции (то есть оригинальная сумма 10 называется в 1-й, 2-й и 4-й экземпляр, вывод состоит из двух рекурсий, двух рекурсий и трех рекурсий, выход sum/2
подает вход 3-го, 5-го и 7-го экземпляров), но я не могу его разгадать, не зная, как оценить sum *= foo(sum, n-1)
или оригинал sum += foo(sum, n-1)
.
Вы должны быть более конкретными в своем вопросе - в чем же проблема с «оценкой» этой строки? Функция вызывается сначала, и ее результат добавляется локальное значение 'sum' – UnholySheep
Нет ничего особенного в' + = 'и рекурсии. У вас есть выражение с правой стороны, которое оценивается, а затем добавляется к объекту слева. Рекурсивные звонки там ничем не отличаются. Для неизменяемых типов 'x + = y' - это то же самое, что и' x = x + y'. –
Извинения, если я просто недостаточно знаю, чтобы правильно задать вопрос. Мне все это известно. Что касается оценки, в 'foo (sum, n-1)' есть два аргумента. Как это добавляется к 'sum'? Что добавляется к 'sum'? Я собрал из вывода, что это был только аргумент 'sum', который был добавлен в' sum', что приводит к второму вопросу: выполняет ли оператор 'sum + = foo (sum, n-1)' вызов другого экземпляра ' foo (sum, n) ', и если да, то почему функция переходит к' sum/2' до полного изнурения 'n' в' n == 0' и вызывает 'return'? – whitehorse