要求写一个质因数分解的函数,虽然问题不复杂,但在递归实现的时侯无论如何都是返回空值。
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也是可以的。