2016-10-02 2 views
-1

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).

+2

Вы должны быть более конкретными в своем вопросе - в чем же проблема с «оценкой» этой строки? Функция вызывается сначала, и ее результат добавляется локальное значение 'sum' – UnholySheep

+5

Нет ничего особенного в' + = 'и рекурсии. У вас есть выражение с правой стороны, которое оценивается, а затем добавляется к объекту слева. Рекурсивные звонки там ничем не отличаются. Для неизменяемых типов 'x + = y' - это то же самое, что и' x = x + y'. –

+0

Извинения, если я просто недостаточно знаю, чтобы правильно задать вопрос. Мне все это известно. Что касается оценки, в 'foo (sum, n-1)' есть два аргумента. Как это добавляется к 'sum'? Что добавляется к 'sum'? Я собрал из вывода, что это был только аргумент 'sum', который был добавлен в' sum', что приводит к второму вопросу: выполняет ли оператор 'sum + = foo (sum, n-1)' вызов другого экземпляра ' foo (sum, n) ', и если да, то почему функция переходит к' sum/2' до полного изнурения 'n' в' n == 0' и вызывает 'return'? – whitehorse

ответ

0

В Python x += y такое же как x = x + y т.е. добавить y к значению x и сохранить в x.

В вашем случае sum += foo(sum, n-1) означает добавить значение, возвращенное foo(sum, n-1) с sum и сохранить его как sum.

Это так же идет на *=, -= и т.д. Например: x *= y означает умножение у с й и сохранить его как х. Надеюсь, что ответили на ваш вопрос.

Прочитать: Augmented Assignment Statements для получения дополнительной информации.

+4

* x + = y такой же, как x = x + y *: только для неизменяемых типов. Для изменяемых типов существует опция для изменения объекта на месте. Поэтому для списков '+ =' совпадает с 'list.extend()', за которым следует повторное связывание имени. –

+0

Спасибо за ваш ответ. У меня есть вопрос: какова природа значения, возвращаемого функцией с несколькими аргументами, которая позволяет добавлять ее к одной переменной? Эта форма работает только тогда, когда переменная с левой стороны также является одним из аргументов с правой стороны? Какой будет выход 'mus + = foo (sum, n-1)'? И следующий вопрос: в приведенной выше функции оператор 'sum + = foo (sum, n-1)' вызывает другой экземпляр 'foo (sum, n)', и если да, то почему функция перейдите к 'sum/2', прежде чем полностью исчерпать' n' в 'n == 0' и вызвать return? – whitehorse

0

Хотя я до сих пор не понял, почему данная функция производит вывод, который она делает, я, наконец, определил главный вопрос темы, а именно, как оценить утверждения формы var += func(var, n-1).

Хотя утверждение формы x += y достаточно просто для понимания, функция в правой части рассматриваемого оператора имеет несколько аргументов. Я не мог понять, какая ценность от func(var, n-1) должна была использоваться и как это было определено. Поэтому я экспериментировал. Я добавил новую функцию mus = 3 к функции и заменил sum += foo(sum, n-1) на mus += foo(sum, n-1) и распечатал результат. Я отменил позиции аргументов в функции и проверил результат. И я добавил третий аргумент функции и проверил это. Каждый раз в каждом варианте sum += foo(sum, n-1) вызывается значение sum.

И затем я удалил sum из return sum и запустил его, в результате чего был получен TypeError, а затем щелкнул. Поэтому я изменил его на return n-1, а затем это стало значением, которое было вызвано в sum += foo(sum, n-1). Я изменил его на новую третью переменную, которую я добавил, return x, а затем это значение было вызвано.

Похоже, что для оценки операторов формы var += func(var, n-1) вы должны проверить, какой аргумент возвращается в базовом случае, когда функция запущена. Исправления были бы очень признательны, если я ошибаюсь ~

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