python从零开始--16 函数之递归

  如果一个函数体直接或间接调用自己,那么这个函数就称为递归函数。可以将“递归函数计算”理解为“建立金字塔”,每次调用递归,相当于创建一层金字塔,并同时触发创建下一层金字塔,直到最高层创建完毕后,因为没有地方累积新的一层,整个创建过程才结束。

  写递归函数有一个关键点: 递归函数必需有条件让“递归”走向终结,否则就成了无限循环。我们看下面几个例子:

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))


  


猜你喜欢

转载自blog.csdn.net/pansc2004/article/details/80254461
今日推荐