之前对函数递归的理解就是“自己调用自己”,这样理解没错,但这样忽视了一个很重要的问题:在递归一次后,第一次的函数是将会被挂起,而不是直接结束,在递归到最里面一层后,最里面一层结束,接下来仍然会运行倒数第二层,如果这时候恰巧你没有使用适当的方法结束这一层,又恰好你在递归f(*args)
代码的外侧写了一个循环,那这外面一层的函数将会继续执行下去,就会出现很多匪夷所思的结果。
例子:求一个数的所有质数因数
list1 = []
def lkw(number):
global list1
print('the number now is '+str(number))
if number == 1:
print(type(number))
return
else:
for i in range(2,number+1,1):
if number % i == 0:
list1.append(str(i)+' ')
number = int(number//i)
print('result'+str(number))
lkw(number)
a = eval(input())
lkw(a)
for item in list1:
print(item)
在程序中我直接使用了lkw(number)进行递归,在开始进去的时候绝对没问题,随着一层层的深入,当最后一层得到结果1 执行return,返回的是上一层执行到lkw(number)这里,而由于我没有写return,所以又会继续执行for循环,导致最后出错
教训:在写函数递归的时候,最好都要加上return,即使没有返回值,也最好写一个空的return