python学习笔记之递归

不得不使用递归的地方:

  1. 汉诺塔
  2. 目录索引(因为你永远不知道这个目录里边是否还有目录)
  3. 快速排序(二十世纪十大算法之一)
  4. 树结构的定义等如果使用递归,会事半功倍,否则会导致程序无法实现或相当难以理解

使用递归求阶乘:

def factorial(n):
    result = n
    for i in range(1,n):
        result *= i

    return result
number = int(input('请输入一个正整数:'))
result=factorial(number)
print("%d 的阶乘是 :%d"%(number,result))
def factorial(n):
    if n ==1:
        return 1
    else:
        return n*factorial(n-1)
number = int(input("请输入一个正整数:"))
result = factorial(number)
print("%d阶乘是:%d"%(number,result))

递归:有进去,就必有回来。必须要有停止的条件,要不然就是死循环。
必须满足两个条件:函数调用自身,设置了正确的返回条件
在编程上,递归表现为函数调用本身这么一个行为

递归的优缺点

优点:

1)递归的基本思想是把规模大的问题转变成规模小的问题组合,从而简化问题的解决难度(例如汉诺塔游戏)。

2)有些问题使用递归使得代码简洁易懂(例如你可以很容易的写出前中后序的二叉树遍历的递归算法,但如果要写出相应的非递归算法就不是初学者可以做到的了。)

缺点:

1)由于递归的原理是函数调用自个儿,所以一旦大量的调用函数本身空间和时间消耗是“奢侈的”(当然法拉利也奢侈,但还是很多人趋之若鹜)。

2)初学者很容易错误的设置了返回条件,导致递归代码无休止调用,最终栈溢出,程序崩溃。

假设需要求出经历了20个月后,总共有多少对小兔子(迭代 VS递归)
在这里插入图片描述
在这里插入图片描述
迭代的方式实现:

def fab(n):
    n1 = 1
    n2 = 1
    n3 = 1
    if n < 1:
        print("输入有误!")
        return -1
    while(n-2) > 0:
        n3 = n2 + n1
        n1 = n2
        n2 = n3
        n-=1
    return  n3
result = fab(20)
if result !=-1:
    print("总共有%d对小兔子诞生!"%result)

递归的方法实现:

def fab(n):
    if n < 1:
        print("输入有误!")
        return -1
    if n==1 or n==2:
        return 1
    else:
        return fab(n-1) + fab(n-2)
result = fab(20)
if result !=-1:
    print("总共有%d对小兔子诞生!"%result)

汉诺塔的代码解释过程:

def hanoi(n,x,y,z):
    if n==1:
        print(x,'-->',z)
    else:
        hanoi(n-1,x,z,y)#将前n-1个盘子从x转移到y上
        print(x,'-->',z)#将最底下的最后一个盘子从x移到z上
        hanoi(n-1,y,x,z)#将y上的n-1个盘子移到z上
n = int(input('请输入汉诺塔的层数:'))
hanoi(n,'x','y','z')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值