笔记参考自嵩天老师讲课的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(n−1)!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(n−1)!n=0otherwise
def fact(n):
if n == 0:
return 1
else:
return n*fact(n-1)
2.1.1、函数 + 分支语句
-递归本身是一个函数,需要函数定义方式描述
-函数内部,采用分支语句对输入参数进行判断
-基例和链条,分别编写对应代码
2.1.2、递归的调用过程
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(n−1)+F(n−2)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片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。
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(n−1)种方法;
i
f
if
if第一次走两步,还剩
f
u
n
c
(
n
−
2
)
func(n-2)
func(n−2)种方法.
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']
后续实例待更新…