python:递归函数
Posted keep
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python:递归函数相关的知识,希望对你有一定的参考价值。
在函数内部我们可以调用其它函数如:
def say(great): return great def person(name): print(say("Hello"), name) person("珊迪 奇克斯")
打印如下:
>>> Hello 珊迪 奇克斯
但如果我们调用自身,这个函数就是递归函数
举个例子,我们来计算阶乘 n! = 1 x 2 x 3 x ... x n(比如5的阶乘:5*4*3*2*1)用函数fact(n)表示可以看出:
fact(n) = n! = 1x 2 x 3 x .....x (n - 1) x n = (n - 1) ! x n = fact(n - 1) * n
所以,fact(n)可以表示n * fact(n - 1),只有n = 1时需要特殊处理。(否则1*fact(1 - 1) =0没有意义)
于是,fact(n) 用递归的方式写出来就是:
def fact(n): if n == 1: return 1 return n * fact(n - 1)
上面就是一个递归函数,我们把它写成一个功能方便我们演示结果
detail = input("阶乘计算器: 九九参考计算器 按任意键继续\\n\\n") def face(n): if n == 1: return 1 return n * face(n - 1) while True: num = int(input("输入数值你想找到的阶乘:")) print("阶乘结果是:",face(num)) print("---------------------")
这样我们就可以演示我们写的阶乘计算器程序了!
如果我们计算fact(5)可以根据函数定义看到计算过程如下:
===> fact(5) ===> 5 * fact(4) ===> 5 * (4 * fact(3)) ===> 5 * (4 * (3 * fact(2))) ===> 5 * (4 * (3 * (2 * fact(1)))) ===> 5 * (4 * (3 * (2 * 1))) ===> 5 * (4 * (3 * 2)) ===> 5 * (4 * 6) ===> 5 * 24 ===> 120
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。如下面用循环实现阶乘
def fate(max_num): temp = 1 for i in range(1,max_num + 1): temp = temp * i print(temp) fate(5)
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000)
:
>>> fact(1000) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in fact ... File "<stdin>", line 4, in fact RuntimeError: maximum recursion depth exceeded in comparison
以上是关于python:递归函数的主要内容,如果未能解决你的问题,请参考以下文章