Python基础教程

016_递归函数

递归函数

递归函数的理解与定义

递归函数是在函数内部调用自身的函数结构,它构成一个死循环,需要设置退出条件。

递归函数主要解决递推问题。

递归函数的关键是内存中的调用过程(前进,入栈)和计算过程(后退,出栈)。每次调用时,生成新的函数对象(内存入栈),直到满足退出条件时停止生成新函数对象并开始转入计算。每次计算时,依次结束满足条件的函数,后退(内存出栈),直到回到第一次调用为止。

例如,有一个递推函数

f(0)=0                       (n==0)
f(n)=n+f(n-1)                (n>=1)

示例程序如下

alist=[0,1,2,3,4,5]

# 普通函数,遍历数组并计算
def sumFun(alist):
    asum=0
    for i in range(len(alist)):
        asum=asum+alist[i]
    return asum

print(sumFun(alist))      # 15

# 递归函数的定义,里面隐含了循环过程
def sumFun2(n):
    if n==0:              # 当n==0时返回单个值,不再返回函数的调用,不再循环
        return 0
    asum=n+sumFun2(n-1)   # 当n>=1时返函数的调用,这个函数是自身,构成无限循环
    return asum

print(sumFun2(5))          # 15

事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

递归调用与计算过程分析

# 定义全局变量
i=0

# 递归函数的定义
def sumFun2(n):
    global i
    i=i+1
    # 记录递归前进信息(递进)
    print("第i次调用与对应的n值:",i,n)   
    if n==0:              # 当n==0时返回单个值,不再返回函数的调用,不再循环
        return 0
    asum=n+sumFun2(n-1)   # 当n>=1时返函数的调用,这个函数是自身,构成无限循环
    # 记录递归后退信息(回归)
    print("第i次调用与对应的n和asum:",i,n,asum)
    return asum

print(sumFun2(5))          # 15

运行结果

C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
第i次调用与对应的n值: 1 5
第i次调用与对应的n值: 2 4
第i次调用与对应的n值: 3 3
第i次调用与对应的n值: 4 2
第i次调用与对应的n值: 5 1
第i次调用与对应的n值: 6 0
第i次调用与对应的n和asum: 6 1 1
第i次调用与对应的n和asum: 6 2 3
第i次调用与对应的n和asum: 6 3 6
第i次调用与对应的n和asum: 6 4 10
第i次调用与对应的n和asum: 6 5 15
15

Process finished with exit code 0

递归就是一种无限循环与控制。如果循环次数太多,会造成栈溢出,因为每次递进时会生成新的函数对象(内存大小有限)。

这篇文章对您有用吗?

我们要如何帮助您?