递归函数不会在第二次执行中清除参数

时间:2018-10-29 04:16:21

标签: python python-3.x debugging recursion

我在编程练习中遇到一些问题,我正在做一个函数来发现数字的除数,如https://es.wikipedia.org/wiki/M%C3%A1ximo_com%C3%BAn_divisor中所示,问题是

为什么要执行:

print (div_comun_divisor(60))

我得到:

  

([60,30.0,15.0,5.0,1.0],[2,2,3,5])

但是如果我同时执行这两行:

print (div_comun_divisor(40))
print (div_comun_divisor(60))

我知道了

  

([40,20.0,10.0,5.0,1.0],[2,2,2,5])

     

([40,20.0,10.0,5.0,1.0,30.0,15.0,5.0,1.0],[2,2,2,5,5,2,2,   3,5])

我可以观察到,第一个执行正确返回,但是第二个执行获取第一个执行的值,然后继续覆盖第一个值。

代码如下:

def primos(limite):
    primos = []
    for numero in range(2, int(limite) + 1 ):
        if es_primo(numero):
            primos.append(numero)
    return primos


def es_primo(numero):
    for i in range(2,numero):
        if (numero % int(i))==0:
            # es divisible
            return False
    return True

def div_comun_divisor(resto, divisores = [], candidatos = []):
    lisprimos = primos(resto)
    if len(divisores) == 0:
        #import pdb; pdb.set_trace()
        divisores.append(resto)
    for primo in lisprimos:
        resto_antes = resto
        resto = resto / primo
        residuo = resto_antes % primo
        if (residuo == 0 and resto > 0):
            divisores.append(resto)
            candidatos.append(primo)
            break;
        else:
            resto = resto_antes
    if(divisores[-1] == 1):
        return (divisores, candidatos)
    else:
        return div_comun_divisor(divisores[-1], divisores, candidatos)

#print (primos(20))
#print (div_comun_divisor(40))
print (div_comun_divisor(60))

您能帮我检查一下问讯器中的错误吗?非常感谢。

0 个答案:

没有答案