函数递归--Python代码实例

笔记参考自嵩天老师讲课的pdf~

1、函数递归的理解

1.1、函数递归的定义

1.1.1、函数定义中调用函数自身的方式

f ( x ) = { 1 n=0 n ( n − 1 ) ! otherwise f(x)= \begin{cases} 1 & \text{n=0}\\ n(n-1)! & \text{otherwise} \end{cases} f(x)={ 1n(n1)!n=0otherwise

1.1.2、两个关键特征

–链条:计算过程存在递归链条

–基例:存在一个或多个不需要再次递归的基例

1.1.3、类似数学归纳法

数学归纳法:
  -证明当 n n n取第一个值 n 0 n_0 n0时命题成立
  -假设当 n k n_k nk时命题成立,证明当 n = n k + 1 n=n_{k+1} n=nk+1时命题也成立
递归是数学归纳法数学思维的编程体现
 

2、函数递归的调用过程

2.1、递归的实现

f ( x ) = { 1 n=0 n ( n − 1 ) ! otherwise f(x)= \begin{cases} 1 & \text{n=0}\\ n(n-1)! & \text{otherwise} \end{cases} f(x)={ 1n(n1)!n=0otherwise

def fact(n):
	if n == 0:
		return 1
	else:
		return n*fact(n-1)

2.1.1、函数 + 分支语句

-递归本身是一个函数,需要函数定义方式描述
-函数内部,采用分支语句对输入参数进行判断
-基例和链条,分别编写对应代码

2.1.2、递归的调用过程

函数递归--Python代码实例_第1张图片
 

3、函数递归实例解析

3.1、字符串反转

将字符串翻转后输出
> > > s [ : : − 1 ] >>>s[::-1] >>>s[::1]

def reverse(s):
	if s == "":
		return s
	else:
		return reverse(s[1:]) + s[0]

3.2、斐波那契数列

斐波那契数列数列从第3项开始,每一项都等于前两项之和。
例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…
F ( n ) = { 1 n=1 1 n=2 F ( n − 1 ) + F ( n − 2 ) otherwise F(n)= \begin{cases} 1& \text{n=1}\\ 1& \text{n=2}\\ F(n-1)+F(n-2)& \text{otherwise} \end{cases} F(n)=11F(n1)+F(n2)n=1n=2otherwise

def Func(n):
	if n == 1:
		return 1
	elif n == 2:
		return 1
	else:
		return Func(n-1)+Func(n-2)

3.3、汉诺塔

问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。
函数递归--Python代码实例_第2张图片

count = 0
def hannuo(n,start,mid,final):
    global count
    if n == 1:
        print("{}:{}->{}".format(1,start,final))
        count += 1
    else:
        hannuo(n-1,start,mid,final)
        print("{}:{}->{}".format(n,start,mid))
        count += 1
        hannuo(n-1,mid,start,final)

hannuo(3,"A","B","C")
#output
1:A->C
2:A->B
1:B->C
3:A->B
1:B->C
2:B->A
1:A->C

3.4、阶梯问题

问题描述:
上阶梯,一次可以上一阶或者二阶,共N阶台阶。求共有多少种方法上去?
思路: i f if if第一次走一步,还剩 f u n c ( n − 1 ) func(n-1) func(n1)种方法;
    i f if if第一次走两步,还剩 f u n c ( n − 2 ) func(n-2) func(n2)种方法.

def func(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return func(n-1) + func(n-2)

3.5、全排列问题

问题描述:
对一个字符串进行全排列,例如’abc’: 有’abc’、‘acb’、‘bca’、‘bac’、‘cab’、'cba’共六种
思路:依次排
    i f if if第一个放 ′ a ′ 'a' a,有 f u n c ( ′ b c . . . ′ ) func('bc...') func(bc...)
    i f if if第一个放 ′ b ′ 'b' b,有 f u n c ( ′ a c . . . ′ ) func('ac...') func(ac...)
        …

def func(sstr):
	size = len(sstr)
	if size == 1:
		return sstr
	else:
		sort_list = []
		for i in range(size):
			first_str = sstr[i]
			left_str = sstr[:i] + sstr[i+1:size]
			for j in func(left_str):
				sort_list.append(first_str + j)
	return sort_list

sstr = 'abc'
print('共有{}种排序: {}'.format(len(func(sstr)),func(sstr)))

##output
共有6种排序: ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

后续实例待更新…

你可能感兴趣的:(python笔记,python,算法)