FishC笔记—23,24 讲 递归:这帮小兔崽子,汉诺塔

本期内容详解:
斐波那契数列的两种实现方式:
迭代的方式:

    def fab(n):  
        n1 = 1  
        n2 = 1  
        n3 = 1  
        if n < 1:  
            n = int(input('输入有误,请重新输入:'))  
            return -1  
        while n-2 > 0:  
            n3 = n1 + n2  
            n1 = n2  
            n2 = n3  
            n -= 1  
        return n3  

    result = fab(30)  
    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(30)  
if result != -1:  
    print('总共有%d对小兔崽子诞生!'%result) 

用递归的方式解决汉诺塔问题:

    def hannoi(n,x,y,z):  
        if n == 1:  
            print(x,'-->',z)  
        else:  
            hannoi(n-1,x,z,y)#将前n-1个盘子移动到y上  
            print(x,'-->',z)#将最底下的盘子移动到z上  
            hannoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上  

    n = int(input('请输入汉诺塔的层数:'))  
    hannoi(n,'X','Y','Z')  

典型课后题
使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。

    def Bin(n):  
        temp = ''  
        if n:  
            temp = Bin(n//2)  
            temp += str(n%2)  
            return temp  
        else:  
            return temp          

    num = int(input('请输入一个十进制数:'))  
    print(num,'-->',Bin(num))  

写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==>
[1, 2, 3, 4, 5]

解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件
设置正确。

    def get_digits(n):  
        result = ''  
        if n:  
            result = get_digits(n//10)  
            result += str(n%10)  
        return list(result)  

    num = int(input('请输入一个数:'))  
    print(get_digits(num))  

还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能傲娇的说我可以吗?

解题思路:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对
比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。

def Huiwen(temp,start,end):  
    if start > end:  
        return 1  
    else:  
        if temp[start]==temp[end]:  
            return Huiwen(temp,start+1,end-1)  
        else:  
            0  

temp = input('请输入一段文字:')  
length = len(temp)  
end = len(temp)-1  
if Huiwen(temp,0,end):  
    if temp[0:length//2] == temp[length//2:length]:  
        print('%s不是一个回文字符串!'%temp)  
    else:  
        print('%s是一个回文字符串!'%temp)  
else:  
    print('%s不是一个回文字符串!'%temp)    

使用递归编程求解以下问题:

    def Age(n):  
        if n == 1:  
            return 10  
        if n > 1:  
            age = 10  
            age = Age(n-1) + 2  
            return age  

    num = int(input('请输入要查询的编号:'))  
    print('第%d个人的年龄是:%d'%(num,Age(num)))  
目录 笔记_小甲鱼零基础入门学习python系列教程 1 目录 2 序 4 01:我和Python的第一次亲密接触 7 02:用Python设计第一个游戏 9 03:小插曲之变量和字符串 11 04:改进我们的小游戏 13 05:闲聊之Python的数据类型 15 06:Pyhon之常用操作符 16 07:了不起的分支和循环1 17 08:了不起的分支和循环2 19 09:了不起的分支和循环3 21 10:列表,一个打了激素的数组1 23 11:列表,一个打了激素的数组2 25 12:列表,一个打了激素的数组3 27 13:元组,戴上了枷锁的列表 30 14:字符串:各种奇葩的内置方法 32 14结:字符串内置方法小结 37 15:字符串的格式语句与操作符 39 16:序列相关内置函数介绍 43 1-16:阶段总结 48 17:函数:Python的乐高积木 49 18:函数:灵活即强大 50 18延:py文件打包成exe文件 52 19:函数:我的地盘我做主 53 20:函数:内嵌函数和闭包 55 21:函数:lambda表达式 57 22:函数:递归是神马 58 延:Python函数修饰符(装饰器)的使用 59 23递归这帮兔崽子 62 24递归汉诺塔 63 17-24:阶段总结 64 25:字典:当索引值不好用时 65 26:字典:当索引值不好用时2 66 26延:你知道Python的字典是如何存储的吗? 69 27:集合:在我的世界里,你就是唯一 71 27结:集合类型内建方法总结 72 28:文件:因为懂你,所以永恒 73 29:文件:一个任务 75 30:文件系统:介绍一个高大上的东西 78 28-30结:文件的打开模式和文件对象方法总结 82 31:永久存储:腌制一缸美味的泡菜 83 32:异常处理:你不可能总是对的 84 33:异常处理:你不可能总是对的2 86 32-33Python标准异常总结 89 34:丰富的else语句和简洁的with 92 35:图形界面用户入门:EasyGui 94 36:类和对象:给大家介绍对象 94 37:类和对象:面向对象编程 96 38:类和对象:继承 97 38延:多重继承的陷阱之钻石继承(菱形继承)问题 98 39:类和对象:拾遗 102 39延:Python Mixin 编程机制 105 40:类和对象:一些相关的BIF 108 40延:property的详细使用方法 110 41:魔法方法:构造和析构 112 42:魔法方法:算术运算符 114 42延:鸭子类型(duck typing) 116 43:魔法方法:算术运算符2 118 44:魔法方法:简单定制 119 45:魔法方法:属性访问 121 46:魔法方法:描述符 123 47:魔法方法:定制容器 126 48:魔法方法:迭代器 127 49:魔法方法:生成器 129 41-49结:魔法方法总结 139 50结:os、os.path 模块中关于文件、目录常用的函数使用方法 143 51结:time模块详解(时间获取和转换) 145 52结:datetime模块详解(基本的日期和时间类型) 150 53结:timeit模块_准确测量小段代码执行时间 170 54结:如何使用静态方法、类方法或者抽象方法 176
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值