如果一个函数体直接或间接调用自己,那么这个函数就称为递归函数。可以将“递归函数计算”理解为“建立金字塔”,每次调用递归,相当于创建一层金字塔,并同时触发创建下一层金字塔,直到最高层创建完毕后,因为没有地方累积新的一层,整个创建过程才结束。
写递归函数有一个关键点: 递归函数必需有条件让“递归”走向终结,否则就成了无限循环。我们看下面几个例子:
def sum(stop_num): sum_ = stop_num if stop_num-1 > 0: # “显示” 判断是否能“继续创建金字塔的下一层”,如果不能,递归走向终结 sum_ += sum(stop_num-1) return sum_ print(sum(4))
D:\pythonProjects\venv\Scripts\python.exe D:/pythonProjects/100Prac/59.py 10用递归,打印给定路径下所有文件的路径:
import os def list_dir(n): lisdir = os.listdir(n) for i in lisdir: if os.path.isfile(os.path.join(n, i)): # “隐式” 判断是否能“继续创建金字塔的下一层”,如果不能,递归走向终结 print(os.path.join(n, i)) else: list_dir(os.path.join(n, i)) list_dir(r'D:\pydj')
对于一些逻辑能力很强大的人来说,写个递归是小case,但对于我等凡人来说,如何写出一个好的递归函数呢?我总结一个套路给大家参考。比方说,写上面的sum(stop_num)递归函数,我分成了几步来完成:
step 1: 构建最基础的,只“创建一层金字塔”的函数
def sum(stop_num): sum_ = stop_num # 只“创建一层金字塔” return sum_
step 2: 在step1的代码上添加“创建第二层金字塔" 的语句, 明显“创建第第二层的”函数是 sum(stop_num -1)
def sum(stop_num): sum_ = stop_num sum_ += sum(stop_num-1) # 因为是求和,所以将 “第一层的结果 += 第二层的结果”,然后再return。 return sum_
Step 3: 注意,我们无须考虑后面第三层到第n层怎么构建。接下来只需要隐式或显示的加入条件,让递归能走向终结,就可以了。对于sum()这个函数而言,就是加一个判断条件,就ok。就完成了这个递归函数的代码。
def sum(stop_num): sum_ = stop_num if stop_num-1 > 0: # “显示” 判断是否能“继续创建金字塔的下一层”,如果不能,递归走向终结 sum_ += sum(stop_num-1) return sum_ print(sum(4))