Python学习笔记 - 递归函数

这篇博客探讨了Python中的递归函数,包括其优点(简洁易懂)和缺点(有限的递归深度及资源消耗)。作者强调了在编写递归程序时设置终止条件的重要性,并通过汉诺塔问题举例说明递归的应用。此外,还介绍了id()函数,这是一个用于显示变量或数据唯一标识的内置函数。最后,详细阐述了汉诺塔问题的解决步骤,展示了一种递归解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本内容均来自在北京图灵学院Python免费全栈学习的课堂笔记

递归函数

  • 函数直接或者简介调用自己的函数
  • 优点:简洁,理解容易
  • 缺点:对递归深度有限,消耗资源大
  • python对递归深度有限制,超过限制会报错
  • 写递归程序的时候一定要注意递归结束条件
# 递归函数调用深度限制案例
# 这样编写在java中会直接报错,但在python中会执行到最大限制再报错
# 这也体现了编译型语言和解释型语言的区别
x = 0
def fun():
    global x
    x += 1
    print(x)
    fun()
    return None
# 调用函数
fun()

案例:

#斐波那契数列
#一列数字,第一个值是1,第二个也是1,从第三个开始,每一个数字的值等于前两个数字之和
#数学公式:f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2)
#例如:1,1,2,3,5,8,13......
#求n个斐波那契数列的值
def fib(n):
    if(isinstance(n,int)):
        if(n == 1 or n == 2):
            return 1
        elif(n>2):
            return fib(n-1)+fib(n-2)
        elif(n<0):
            print("不能输入负数")
            return None
    else:
        print("你输入的不是整数,恕我无能为力!")
print(fib(5))
# 思考如何让用户不能输入小数

执行结果:

5

id()函数

  • 是一个内置函数,负责显示一个变量或者数据的唯一确定编号
# id函数案例
a = 100
b = 200
# 这时a和c指向的是同一个内存地址
c = a
print(id(a))
print(id(b))
print(id(c))
# 这时,a指向了另外一个内存地址,而c依然指向原来的内存地址
a = 101
print(c)
print(a)
print(id(c))
print(id(a))
# 列表l和ll指向同一个内存地址,当其中一个改变,并不会重新指向另一个地址,这点要注意
l = [1,2,3,4,5]
ll = l
print(ll)
print(id(ll))
print(id(l))
l[2] = 300
print(ll)

执行结果:

140709824143264
140709824146464
140709824143264
100
101
140709824143264
140709824143296
[1, 2, 3, 4, 5]
1823132875784
1823132875784
[1, 2, 300, 4, 5]

汉诺塔问题

  • 汉诺塔规则:
    • 每次只能移动一个盘子
    • 任何一次移动,三个塔的状态必须是小盒子在上,大盒子在下
    • 移动: n = 1:A->C;
      n = 2:A->B,A->C,B->C;
      n = 3:
      a 把A上的盘子借助C盘移动到B上,
      b 然后把A上最大的盘子放到C上,
      c 再把B上的盘子借助A移动到C上
      n = n:
      1.把A上的n-1个盘子借助C移动到B上去,调用递归
      2.把A上的最大盘子移动到C上,A->C
      3.把B上的n-1个盘子借助于A移动到C上去,调用递归
def hano(n,a,b,c):
    '''
    汉诺塔的递归实现
    n:代表n个盘子
    a:代表A塔,即第一个塔
    b:代表B塔,即第二个塔
    c:代表C塔,即第三个塔
    '''
    if n == 1:
        print(a,"-->",c)
        return None
    if n == 2:
        print(a,"-->",b)
        print(a,"-->",c)
        print(b,"-->",c)
        return None
    # 把n-1个盘子,从a塔借助于c塔,挪到b塔上去
    hano(n-1,a,c,b)
    print(a,"-->",c)
    # 把n-1个盘子,从b塔借助于a塔,挪到c塔上去
    hano(n-1,b,a,c)
a = 'A'
b = 'B'
c = 'C'
print("3个盘子的汉诺塔:")
hano(3,a,b,c)
print("4个盘子的汉诺塔:")
hano(4,a,b,c)

执行结果:

3个盘子的汉诺塔:
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
4个盘子的汉诺塔:
A --> B
A --> C
B --> C
A --> B
C --> A
C --> B
A --> B
A --> C
B --> C
B --> A
C --> A
B --> C
A --> B
A --> C
B --> C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值