首页 > 解决方案 > 如何在递归中保留价值

问题描述

def numb_fact(number): 
    factor_list = []
    for d in range(2, number+1, 1):
        if number % d == 0:
            factor_list.append(d)
        else:
            pass
    return factor_list
def factorize(number):

    allfact_list = numb_fact(number)
    final_list = []
    if len(allfact_list) > 0:
        d = allfact_list[0]
        if number % d == 0:
            final_list.append(d)
            divided_numb = int(number / d)
            factorize(divided_numb)
        else:
            if len(allfact_list) > 1:
                allfact_list.remove(d)
            else:
                return final_list
        print(final_list)
    return final_list

factorize(12)

Sample output
[3]
[2]
[2]

所以我正在编写一个代码来显示一个素数倍数的数字。为了做到这一点,我想从制作一个给我“数字列表”的函数开始,如果列表中的所有数字相乘,它将形成原始数字。

我认为写这个的唯一方法是递归,暂时把我的代码效率放在一边——因为我知道它看起来很糟糕)——我写的这个函数不保留 factor_list 中的值。(很明显!因为我正在重新启动代码,并且它最初定义为'= []')所以我一直想知道是否有办法在单个函数中解决这个问题。

标签: pythonrecursion

解决方案


我不知道你为什么首先生成因子,然后递归检查。没有必要这样做。

使用递归时,尽量不要在递归函数中定义变量然后返回。正如您自己提到的,它每次都会重置,因此只保留其中的最后一个值。

但您可以通过以下方式保留代码中的值:

def numb_fact(number): 
    factor_list = []
    for d in range(2, number+1, 1):
        if number % d == 0:
            factor_list.append(d)
        else:
            pass
    return factor_list
def factorize(number):

    allfact_list = numb_fact(number)
    if len(allfact_list) > 0:
        d = allfact_list[0]
        if number % d == 0:
            divided_numb = int(number / d)
            return [d] + factorize(divided_numb)
    else:
        return []
print(factorize(12))

这是我想出的另一个简短/更好的递归解决方案。

def factor(num,div = 2):
    if num != 1:
        if num%div==0:
            return [div] + (factor(num/div,div))
        else:
            return (factor(num,div+1))

    else:
        return []
print(factor(12))

输出:[2, 2, 3]


推荐阅读