解决Python递归函数返回空值问题

要求写一个质因数分解的函数,虽然问题不复杂,但在递归实现的时侯无论如何都是返回空值。

1、原始的情况:返回None

def IsPrimer(num):
    for i in range(2, int(num**0.5)+1):
        if num % i == 0:
            return False
    return True
    
fl = []
def Factors(num):
    if IsPrimer(num):
        # global fl      the result is still None !
        fl.append(num)
        return fl
    else:
        for i in range(2, int(num**0.5)+1):
            if num % i == 0:
                fl.append(i)
                break
        Factors(num//i)
        
number = int(input("input a number: "))
print(Factors(number))
#   the result is always None !

函数Factor()中就算使用global定义fl为全局变量也是返回None

2、取消了递归出口处的return,使用global定义fl全局变量:返回正确结果

def IsPrimer(num):
    for i in range(2, int(num**0.5)+1):
        if num % i == 0:
            return False
    return True

fl = []
def Factors(num):
    if IsPrimer(num):
        global fl
        fl.append(num)
    else:
        for i in range(2, int(num**0.5)+1):
            if num % i == 0:
                fl.append(i)
                break
        Factors(num//i)

number = int(input("input a number: "))
Factors(number)
print(fl)

3、在调用递归函数前添加return语句:返回正确结果

Python和Java中的函数,如果没有return,则默认返回NULL/None,所以在上面的代码中,不是递归出口的那一分支,其实是想要这一层的递归函数返回Factors(num//i),但是Factors(num//i)前面没有加return,所以这一层递归函数就返回None,之后几层递归也就跟着错了。

而平时C/C++这样写没问题,是因为C/C++默认返回了。

(下面的代码添加了一点本问题无关的内容,可忽略)

def IsPrimer(num):
    for i in range(2, int(num**0.5)+1):
        if num % i == 0:
            return False
    return True

results = []  # global variable
def Factors(num):
    if IsPrimer(num):
        results.append(num)
        # return results      # can be omitted
    else:
        for i in range(2, int(num**0.5)+1):
            if num % i == 0:
                results.append(i)
                break
        return Factors(num//i)  # ATTENTION return

number = int(input("input a number: "))
Factors(number)
results = map(str, results)
result = str(number)+' = '+' * '.join(results)
print(result)

结论:

在python,Java等语言中递归函数每一层都要设置return语句;而在C/C++中仅在递归出口设return也是可以的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值