第023、024讲:递归:这帮小兔崽子、汉诺塔 | 课后测试题及答案
0. 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
me:
def gcd(x): if x <= 1: return str(x) else: return gcd(x//2) + str(x%2) print(gcd(12))
参考答案:
def Dec2Bin(dec): result = '' if dec: result = Dec2Bin(dec//2) return result + str(dec%2) else: return result print(Dec2Bin(62))
1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
me:
def get_digits(n): if len(n) == 1: return [n[len(n)-1]] else: return get_digits(n[:len(n)-1]) + [n[len(n)-1]] n=str(input("请输入一个数字:")) print(get_digits(n))
参考答案:解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件设置正确。
result = [] def get_digits(n): if n > 0: result.insert(0, n%10) get_digits(n//10) get_digits(12345) print(result)
2. 还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能骄傲的说我可以吗?
me:
def get_hui(n): if len(n) == 1: return [True] elif len(n) == 2: return [n[1] == n[0]] else: return get_hui(n[1:len(n)-1]) + [n[len(n)-1] == n[0]] n= str(input("请输入一句话:")) if len(n) == 1 : print("不是回文联") else: if False in get_hui(n): print("不是回文联") else: print("是回文联")
参考答案:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。
def is_palindrome(n, start, end): if start > end: return 1 else: return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0 string = input('请输入一串字符串:') length = len(string)-1 if is_palindrome(string, 0, length): print('"%s"是回文字符串!' % string) else: print('"%s"不是回文字符串!' % string)
3. 使用递归编程求解以下问题:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
me:
def get_da(n): if n == 1: return 10 else: return get_da(n-1) + 2 print(get_da(5))
参考答案:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
def age(n): if n == 1: return 10 else: return age(n-1) + 2 print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))