开始学递归的定义就发现不简单啊,挺绕的。大概做一个定义上的总结,然后记录一下我在练习递归时遇到的各种问题,时常翻出来看看温故知新。
首先是定义上:递归(Recursion)是指在函数的定义中使用函数自身的方法。使用递归必须满足两个基本条件:函数调用自身以及设置正确返回(尤其是终止循环)的条件。它的优点是把大规模的问题逐渐缩小为小规模问题,简化解决问题的难度;缺点是每一次函数的调用都要经过压栈、弹栈、保存和恢复寄存器的栈操作,在运行时会很浪费时间和内存;如果设置了错误的返回条件,代码会无休止调用,栈溢出,崩溃。
要注意两个点,第一并不是所有的迭代都写为递归会更好的,比如阶乘问题和斐波那契数列。第二使用递归确实有很适合的情况,比如汉诺塔,而且使用中要小心谨慎的设置返回条件。递归真正的实现是从里到外的。
然后练习中:
第 1 道习题是十进制转化为二进制(使用除2取余的办法),一开始我的疑问是如果在函数中赋值了空字符串那岂不是每一次运行都变成了空的... 后来才发现递归的终极奥秘是将函数的自身调用放在return内部或者若是结果保存列表就使用append/insert放入列表中,那就算每次都空也没关系,最后的返回值return是全部都加上去的:
def binn(n):
result = ''
list1 = n % 2
if n == 0:
return result
else:
result = binn(n // 2)
return result + str(list1) #而且从循环的最内部开始往后加,也就自然逆序
print(binn(89))
第 2 道习题是将一个整数中的所有digits保存在列表中,由此学会了第二种相加的方式,私认为鱼c答案这里的空列表设定也并不很professional哈哈哈:
result = []
def getdigits(n):
if n > 0:
result.insert(0,n%10)
getdigits(n//10)
return result
print(getdigits(12345)) #这里若函数没有返回值是需要先调用然后打印result的
第 3 题是回文字符串的判断,这是鱼c答案:
def huiwen(str1,start,end):
if start > end:
return 1
else:
return huiwen(str1, start+1, end-1) if str1[start] == str1[end] else 0
string = input('请输入字符串:')
length = len(string) - 1
if huiwen(string, 0, length):
print('%s 是回文字符串!' % string)
else:
print('%s 不是回文字符串!' % string)
最后一题是关于年龄递增的问题,其实很简单的一个递归,但是要注意
1. 一定要找清楚退出递归的条件!!!不要找错也不要漏找。
2. 寻找最合适的自身调用位置。