黑马程序员技术交流社区

标题: Python递归函数 [打印本页]

作者: lastsong    时间: 2018-6-2 22:37
标题: Python递归函数
简单的来定义下这个递归函数,通俗点讲就是一个函数在内部调用自身,这个函数就是递归函数。
来用一段代码以及剖析运行过程,来理解python递归函数。
比如我们要实现一个计算的函数,就比如说,定义参数为10,那么这个函数就要负责计算
10 * 9 * 8 ………… * 3 * 2 * 1 的结果。

先用常规方法:
sum1 =1
for i in range(1,101):
    sum1 = i*sum1
print(sum1)
简述常规方法运行过程:
sum = 1
进入for 循环,迭代1----100的之间的数
for i in range:
i = 1
i = 2
i = 3
i = 4
i = 5
...
i = 100
每一个临时变量i都是一个新的值。
sum1 = sum1 * i 这样写是为了清楚运算逻辑,更简便的写法是
sum1 *= i
每一次sum1 * i 的结果都会存到全局变量sum1里面
(根据for循环,全局变量的值 是不断变化的)
循环结束,按顺序打印sum1的值

使用递归函数方法:
def sum_lewis(n):
    if n <=0:
        return 'sorry,must be >=1'
    if n == 1:
        return 1
    return n * sum_lewis(n-1)
print(sum_lewis(100))
简述递归函数方法运行过程
先定义一个名为sum_lewis的函数,并指定一个n的形参
例行判断如果参数为0就返回提示,如果参数为1就返回1
经过双层判断之后(增加程序容错率),在返回一个计算方式。 n * sum_lewis(n-1) 在返回值中再次调用该函数本身,这种行为就可以把他称作递归函数。
===> sum_lewis(5)
===> 5 * sum_lewis(4)
===> 5 * (4 * sum_lewis(3))
===> 5 * (4 * (3 * sum_lewis(2)))
===> 5 * (4 * (3 * (2 * sum_lewis(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
以上为如果参数为5的,运行推断过程。
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2