heidern0612 发表于 2018-11-21 16:31:15

【Pyhon 023、024讲心得体会】【递归求进制转换】

本帖最后由 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) ==>


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开始,依次往回插入,也就是结果
print(result)





3、回文联



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

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

                return 1                                                           #返回一个真值,(不为零即可,返回几百几千随便。)
      else:
                return is_palindrome(n, start+1, end-1) if n == n 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))





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

来论坛学潮汕话 发表于 2019-3-15 22:45:54

赞同,递归真不是人用的,但一旦用出来了,就让人感叹人类的智慧真是美妙~~~
再次感谢大佬的详细解释,受用不尽!

半夜起床不睡觉 发表于 2020-5-28 09:44:44

点个赞,学习一下

芒竹马 发表于 2020-12-30 11:41:29

{:5_91:}感谢感谢
页: [1]
查看完整版本: 【Pyhon 023、024讲心得体会】【递归求进制转换】