函数-递归调用

目录

一、基本介绍

二、递归能解决什么问题?

三、递归案例

1、打印问题

 2、阶乘问题

四、递归重要规则

五、课堂练习

1、斐波那契数

2、猴子吃桃问题

3、汉诺塔


一、基本介绍

1、简单地说:递归就是函数自己调用自己,每次调用时传入不同的值

2、递归有助于编程者解决复杂问题,同时可以让代码变得简洁

二、递归能解决什么问题?

1、各种数学问题,如8皇后问题,汉诺塔,阶乘问题,迷宫问题等等

2、各种算法中也会使用到递归,如快排,归并排序,二分查找,分治算法等

3、将用栈解决的问题->递归,代码比较简洁

三、递归案例

1、打印问题

# 打印问题
def test(n):
    if n>2:
        test(n-1)
    print("n =", n)

# 调用test(4)
test(4)

 2、阶乘问题

# 阶乘问题
def factorial(n):
    if n==1:
        return 1
    else:
        return factorial(n-1)*n

# 打印4的阶乘
print(factorial(4))

四、递归重要规则

1、执行一个函数时,就创建一个新的空间(栈空间)

2、函数的变量是独立的,比如,变量n

3、递归必须向退出递归的条件逼近,否则就是无限递归,就会出现RecursionError: maximum recursion depth exceeded

4、当一个函数执行完毕,或遇到return,就会返回,遵守谁调用,就将结果返回给谁

五、课堂练习

1、斐波那契数

请使用递归的方式求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的值是多少?

# 斐波那契数
def fbn(n):
    """
    功能:返回n对应的斐波那契数
    :param n:
    :return: 
    """
    if n==1 or n==2:
        return 1
    # 如果n>2,则对应的斐波那契数为n-1和n-2对应的斐波那契数的和
    else:
        return fbn(n-1)+fbn(n-2)

# 完成测试
print(fbn(7))  # 13

2、猴子吃桃问题

猴子吃桃问题:有一堆桃子,猴子第1天吃了其中的一半,并再多吃一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没有吃),发现只有1个桃子了。问题:最初有多少个桃子?

# 猴子吃桃问题
"""
    思路分析:
    1、day==10时,有桃子数 1
    2、day==9时,day9-day9/2-1=day10
       有桃子数 day9=(day10+1)*2
    3、day==8时,有桃子数 day8=(day9+1)*2
"""

# 定义函数,返回对应天数对应的桃子数
def peach(day):
    if day==10:
        return 1
    # 如果是1<=day<10,的范围就是从后一天开始推导
    else:
        return (peach(day+1)+1)*2

# 完成测试
print("最初的桃子数为:", peach(1))  # 1534

3、汉诺塔

 

# 汉诺塔
def hanoi_tower(num, a, b, c):
    """
    输出指定 num个盘子的移动顺序
    :param num: 指定盘子数
    :param a: 表示A柱子
    :param b: 表示B柱子
    :param c: 表示C柱子
    :return:
    """
    # 如果只有一个盘子
    if num == 1:
        print("第1个盘从:", a, "->", c)
    else:
        # 有多个盘,我们认为只有两个,上面所有的盘和最下面的盘
        # 移动上面所有的盘从A移动到B柱子,这个过程会借助到C柱子
        hanoi_tower(num - 1, a, c, b)
        # 移动最下面的盘,从A移动到C柱子
        print(f"第{num}个盘从: {a} -> {c}")
        # 把上面所有的盘从B移动到C柱子,这个过程会借助到A柱子
        hanoi_tower(num - 1, b, a, c)


# 完成测试
hanoi_tower(3, "A", "B", "C")

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值