函数递归--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、递归的调用过程

在这里插入图片描述
 

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片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。
在这里插入图片描述

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']

后续实例待更新…

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值