马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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))
总结一句话,递归真不是人玩的,是神用的。
|