#python #python-3.x #recursion #memory
Вопрос:
итак, у меня есть рекурсивная функция, которую я вызываю 2 раза с разными аргументами, но при втором вызове она не дает правильного результата, она дает правильный результат только тогда, когда я вызываю ее в первый раз, а не во второй. Может быть, проблема с памятью или кэшем ?
def m(n):
s= [int(char) for char in str(n)]
product = 1
for x in s:
product *= x
return product
i = 0
def persistence(n):
global i
if len(str(n)) == 1:
return i
else:
j = m(n)
i =1
s = persistence(j)
return s
print(persistence(39))
print(persistence(4)) #returns 3 when called with the top one but 0 when called alone
Комментарии:
1. Это потому, что вы используете i в качестве глобальной переменной. При повторном выполнении сохранения значение переменной i не равно 0
2.
presistence(4)
вернетсяi
вif
свою ветку. Если он в первый разpersistence
был вызван, значитi
, есть0
. Если вы вызовете его с39
помощью first, этот вызов перейдет вelse
ветвь, которая изменитi
переменную. Его больше не будет0
, когда вы позовете его с.4
Вот почему вам следует избегать глобального, изменчивого состояния
Ответ №1:
У вас есть условие len(str(n))
сохранения функции, так что, если n
есть число от 0 до 9, вы возвращаетесь global i
.
Когда вы вызываете print(persistence(4))
один, ваша функция возвращает global i
значение (равное 0).
Когда вы print(persistence(39))
сначала звоните, а затем print(persistence(4))
первый вызов устанавливается global i
равным 3 , а второй вызов просто возвращает значение global i
, значение которого только что было установлено равным 3.
Я действительно не понимаю, что вы хотите сделать, но, возможно, ваша проблема связана с использованием global
.
Ответ №2:
Проблема в том, что вы используете i в качестве глобальной переменной. Когда вы снова выполните метод, ваш i
def m(n):
s= [int(char) for char in str(n)]
product = 1
for x in s:
product *= x
return product
def persistence_recursive(n, i):
if len(str(n)) == 1:
return i
else:
j = m(n)
i =1
s = persistence_recursive(j, i)
return s
def persistence(n):
return persistence_recursive(n, 0)
print(persistence(39)) # returns 3
print(persistence(4)) # returns 0