Каким должен быть вывод ниже кода Python?Этот код взят из онлайн-викторины, и там дан ответ 0 - PullRequest
0 голосов
/ 08 мая 2019

Этот код взят из онлайн-викторины для Python. Ответ на сайте дан как 0. Я не понимаю ответ, приведенный в викторине.Насколько я понимаю, ответ должен быть (1,1).

def func(x, ans):
   if(x==0):
      return 0
   else: 
      return func(x-1, x+ans) 

print(func(2,0))

Я ожидаю, что вывод print (func (2,0)) будет (1,1), но ответ данэто 0.

Ответы [ 4 ]

1 голос
/ 08 мая 2019

Итерация 0: x = 2, ans = 0;Переход к оператору 'else', теперь x = 1, ans = 2.

Итерация 1: x = 1, ans = 1;Переход к выражению «else», теперь x = 0, ans = 3.

Итерация 2: x = 0, ans = 3;Переходит к оператору if, возвращает функцию, которая выдает «0»

0 голосов
/ 08 мая 2019

Если вы хотите знать, как работает какой-то код, хорошей практикой является просто проходить его построчно.Так что с этой функцией это будет:

Что делает эта функция

Сначала функция проверяет, равен ли ее вход x 0.Если это так, он возвращает 0 и, возвращая, это также означает, что функция завершена.

if(x==0):
    return 0

Если x не равен 0, оператор if вернет False, в результате чего функция переходит к следующим строкам:

else: 
    return func(x-1, x+ans)

Здесь функция вызывает себя со значением x, уменьшенным на 1.Итак, здесь мы видим, что эта функция на самом деле является рекурсивной функцией (подробнее о рекурсивных функциях здесь и здесь ).Второй параметр func - это значение ans, присвоенное исходной функции, добавленной к значению x.Это единственное вхождение переменной ans, означающее, что она на самом деле не имеет значения в самой функции.
Теперь, вызывая функцию с уменьшенным значением x, она снова проверит, равно ли это значение0.Если это так, он вернет 0, что означает, что функция func, которая вызвала эту новую функцию func, также вернет 0.Или он снова вызовет функцию func с уменьшенным значением x.Это будет происходить до тех пор, пока значение x не станет равным 0.
Это означает, что единственным значением, которое когда-либо будет возвращено из этой функции, будет 0.

Итак, короче говоря,Функция сможет вернуть только 0.

Почему бы не (1,1)

Итак, вы думаете, что возвращаемое значение func будет (1,1).Если вы не знаете, что делает эта функция, я думаю, я понимаю, почему вы думаете, что это произойдет.Я предполагаю, что с этими параметрами в операторе возврата функции:

(x-1, x+ans)

x будет уменьшен на единицу, делая его 1 (при вводе (2, 0)), потому что 2 - 1 = 1.И используя это значение x в x+ans, получается 1 + 0 = 1.В результате возвращается значение (1,1).

Но, как уже говорилось, это не так.Значения не рассчитываются таким образом, это просто параметры, переданные функции, чтобы она могла обрабатывать их внутри.
Также, как уже было сказано, функция вернет только 0, что является целым числом.Это делает невозможным возвращение типа кортежа, например (1,1).

0 голосов
/ 08 мая 2019

Один из способов отследить происходящее - добавить пару print операторов в определение вашей функции -

def func(x, ans):
     print(f"x is:\t {x}")
     print(f"ans is:\t {ans}")
     if(x==0):
         return 0
     else: 
         return func(x-1, x+ans)

А затем запустите функцию print(func(2,0)) и посмотрите, какие значения выводятся на печать

0 голосов
/ 08 мая 2019

return 0 make func всегда возвращать 0.
Кроме того, эта функция не может возвращать (1,1), тип возврата - число


Как насчет кода ниже?

def func(x, ans): 
    print(x, ans)
    if(x==0): 
        return ans # updated
    else: 
        return func(x-1, x+ans) 
print(func(2,0))
# output: 3

Или

def func(x, ans): 
    print(x, ans)
    if(x==0): 
        return 0
    else: 
        return (x-1, x+ans) #updated
print(func(2,0))
#Output: (1, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...