递归函数定义
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
我们来计算阶乘 n! = 1 x 2 x 3 x ... x n ,用函数 fact(n) 表示
fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
所以, fact(n) 可以表示为 n x fact(n-1) ,只有n=1时需要特殊处理。
于是, fact(n) 用递归的方式写出来就是:
def fact(n): if n==1: return 1 return n * fact(n - 1)
上面就是一个递归函数。可以试试:
>>> fact(1) 1 >>> fact(5) 120 >>> fact(100) 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L
如果我们计算 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
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
利用函数编写如下数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/10/18 11:17 # @Author : evescn # @Site : # @File : dg.py # @Software: PyCharm def func(arg1, arg2): # for i in range(10): if arg1 == 0: print(arg1) print(arg2) arg3 = arg1 + arg2 if arg3 < 1000: print(arg3) func(arg2, arg3) else: return func(0, 1)
# 运行结果 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987