本文是跟着鱼C论坛小甲鱼零基础学习Python3的视频学习的,课后题也是跟随每一课所附属的题目来做的,根据自己的理解和标准答案记录的笔记。
第二十三课与二十四课
测试题:
0.使用递归编写一个十进制转换为二进制的函数(要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式)
答:通过地板除2的方法层层处理数据到底层,然后以除二取余的方式得到二进制的每一位数。
def dtbin(num):
def tbin(num):
result = ''
if num:
result = tbin( num // 2 )
return result += str(num % 2)
else:
return result
if num == 0:
return '0b' + '0'
else:
return '0b' + tbin(num)
原题解是上述函数中的内置函数 tbin() 的书写方式,但是运行之后出现一个问题,就是在二进制转换的实现过程中 tbin() 有缺陷,即不能转化出 0 的正确返回值,并且每次返回的只有二进制代码的本身数值,而不同于原始 BIF 的 bin() 返回的是 '0b' 前缀加上二进制数值。所以为了改善补充原题解的不足,将其变为内置函数运行,在外部增加 0 的返回值并且添加 '0b' 的前缀。从而使得此新函数结果与功能与原内置 BIF 的 bin() 函数一样。
1.写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345)==>[1,2,3,4,5]
答:通过地板除10的方法将目标参数一层层分离出来,然后以除10取余的方式得到每个位置的数字。
def get_digits(n):
result = ''
if n:
result = get_digits(n//10)
result += str(n%10)
return list(result)
最终以列表的方式输出。
2.还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能傲娇的说我可以吗?
答:通过首尾每一位进行比较的方法,先将目标参数分离出每一对首尾对应位的元素进行比较,形成内置判断函数 hwlpd(),然后外函数整理目标参数的数据,去掉目标参数前后半段全等的情况以及全不等的情况。
def hwl(words):
start = 0
end = len(words) - 1
def hwlpd(words, start, end):
if start > end :
return 1
else:
if words[start] == words[end]:
return hwlpd(words, start + 1, end - 1)
else:
return 0
if hwlpd(words, start, end):
if words[0:len(words)//2] == words[len(words)//2:len(words)]:
print('%s 不是一个回文联字符串'%words)
else:
print('%s 是一个回文联字符串!'%words)
else:
print('%s 不是一个回文联字符串'%words)
需要注意的是,原答案是写出内置函数之后在全局进行补充条件来跟进的,并且没有添加全杂元素的目标参数对象的返回结果,所以我补充改善了这一点,并且将其整理成现在的一个内嵌型的复合函数。
3.使用递归编程求解以下问题:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数, 他说比第三个人大两岁,问第三个人,又说比第二个人大两岁,问第二个人,又说比第1个人大两岁。 最后问第一个人,他说是10岁。请问第5个人多大?
答:利用递归的方法,递归分为回推和递推两个阶段,要想知道第五个人的岁数,必须要知道第四个人的岁数,依次类推,推到第一个人10岁,再往回推。
def age(n):
if n == 0:
print('输入有误!')
elif n == 1:
return 10
else:
return age(n-1) + 2