解决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也是可以的。

你可能感兴趣的:(Python)