почему функция возвращает другое при вызове в одиночку, а не при повторном вызове

#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