鱼C论坛

 找回密码
 立即注册
查看: 2228|回复: 3

[学习笔记] 【Pyhon 023、024讲心得体会】【递归求进制转换】

[复制链接]
发表于 2018-11-21 16:31:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 heidern0612 于 2018-12-17 10:02 编辑

写的内容都是自我思考的过程,难免有疏漏和错误的地方,欢迎广大鱼油给予指正!


好难有木有,真想就这么跳过去算了。。反正我也理解不明白,但是还是咬牙坚持了下来,思考了一下午,有点想通了老师的算法。

有点绝望有木有?看懂都这么难,什么时候能上手写这种代码呢?……

递归居然给我个感觉,比较像是while循环,都是满足一定条件跳出,不同的是递归跳出后还得往回返。不说废话,上手。


1、十进制转换二进制。

说实话我数学一直垫底,这个理解起来太困难太烧脑了。
def Dec2Bin(dec):
    result = ''                                          #result定义一个初始化的空字符串
    
    if dec:                                                #老师定义的数字62太高端大气上档次了,我就简化个十进制的10,二进制是1010,也比较好举例子;
                                                        #if dec表示dec不为零时,为零时返回值给result。


        result = Dec2Bin(dec//2)                #函数调用赋值实参10的时候,这里的结果应该是 result = Dec2Bin(10//2);
        return result + str(dec%2)                #return =Dec2Bin(10//2) + str(10%2) =Dec2Bin(5)+str(0);
                                                        #        从Dec2Bin(5)返回的是Dec2Bin(2)+str(5%2)=Dec2Bin(2)+str(1);
                                                        #        从Dec2Bin(2)返回的是Dec2Bin(1)+str(2%2) =Dec2Bin(1)+str(0);
                                                        #        从Dec2Bin(1)返回的是Dec2Bin(0) +str(1%2)= 0+str(1)  (这里Dec2Bin为0,执行的else语句)
    else:
        return result

print(Dec2Bin(10))                                #所以Dec2Bin(10) = 从末尾开始往回返倒序的“1010”




2、写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
result = []                                                #result初始化空列表,大神都喜欢初始化为空。
def get_digits(n):
        if n > 0:                        
                result.insert(0, n%10)                #这里使用insert插入符,12345%10 求余除,结果为5;  二次循环1234%10,结果为4;  三次循环123%10,结果为3;
                                                                #四次循环12%10,结果为2;  五次循环1%10,结果为1;   六次循环n值为0,跳出。

                get_digits(n//10)                        #get_digits函数经过整除后,结果为1234,也就是get_digits(1234);   二次循环结果get_digits(123);
                                                                #三次循环结果get_digits(12);   四次循环结果get_digits(1);   五次循环get_digits(0)

get_digits(12345)                                        #实际结果应该是从第五次循环结果为1开始,依次往回插入,也就是结果[1,2,3,4,5]
print(result)



3、回文联
def is_palindrome(n, start, end):                                        #定义一个函数,三个形参。n为整个字符串内容,start为开始索引位置,end为末尾索引位置。
        if start > end:                                                        #如果 start的索引大于末尾索引位置的时,返回真值,表示已经判定过整个字符串了,一开始我也一脸懵逼,后来仔细想想明白了:
                                                                                #假定字符串有五个长度[0,5],(最好在纸上写下0 1 2 3 4 五个数字)
                                                                                #当开始索引[2]=末尾索引[2]的时候,双方都指在中间数2这个位置的时候,就已经检查完毕,那为什么要判定大于的情况呢?

                                                                                #假定字符串有四个长度[0,4]呢?(0 1 2 3),怎么才能索引个遍呢?
                                                                                #很明显,只有当开始索引[2]>末尾索引[1]的时候,开始指在2,末尾指在1的时候,才算索引个遍,这个大于判定就这么来的。

                return 1                                                             #返回一个真值,(不为零即可,返回几百几千随便。)
        else:
                return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0        #这个语句判断的就是未完成检查的情况,从字符串0根末尾索引-1比较(不知道为何减一的同学面壁)。
                                                                                                                #依次开始第二位跟倒数第二位,开始第三位跟倒数第三位……        

                                                                                                                #不相同的话就返回0,非真,假值。
        
string = input('请输入一串字符串:')
length = len(string)-1                                                        #不知道为何减1的同学面壁。

if is_palindrome(string, 0, length):                                        #这里传入三个实参,如果if为真值,也就是不为零,非真,假值的情况下(不为零的情况下就包含上面函数的判定:1、从头到位的检索,2、字符串的比较是否相等)
        print('"%s"是回文字符串!' % string)                                #是真的情况下打印是回文联        
else:        
        print('"%s"不是回文字符串!' % string)                        #否则打印不是回文联。




4、算年龄的问题

这个问题比较傻瓜,应该算是习题里面比较简单的了,我用二元一次方程就可以算出来(小学水平,捂脸)。

这个递归也应该是习题里面比较简单的,小甲鱼老师起码给点面子,不让大家一题都不会。
def age(n):
    if n == 1:                                #一个人的情况下,自然就是自报岁数的那个10岁的娃娃了
        return 10
    else:
        return age(n-1) + 2                #n代表人数,岁数随着n的减少而加2岁,一直减到1个人的时候,就是上面的情况了。
        
print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))



总结一句话,递归真不是人玩的,是神用的。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
nizitao + 1 + 1 + 1 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-15 22:45:54 | 显示全部楼层
赞同,递归真不是人用的,但一旦用出来了,就让人感叹人类的智慧真是美妙~~~
再次感谢大佬的详细解释,受用不尽!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-28 09:44:44 | 显示全部楼层
点个赞,学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-30 11:41:29 | 显示全部楼层
感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 07:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表