1、递归的定义
递归是解决问题的一种方法,它将问题不断地分成更小的子问题,直到子问题可以用普通的方法解决。通常情况下,递归会使用一个不停调用自己的函数。即每一次递归调用都是在解决一个更小的问题,如此往复,直到问题本身不能再简化为止。
递归算法的特点:当问题无法再简化时,我们开始拼接所有子问题的答案,以此解决最初的问题。
2、递归算法的三要素
(1)递归算法中必须含有结束递归的标志;
(2)递归算法必须改变其状态并向基本情况靠近;
(3)递归算法必须递归的调用自己;
解析:
①递归算法中必须含有结束递归的标志(防止形成死循环)——因为递归算法是将一个问题不断的划分为多个小问题进行解决,直到划分后的小问题可以直接得出结果,则将这个小问题情况作为递归算法的结束标志。
②递归算法中必须改变其状态缩小递归范围——必须设法改变算法的状态,从而使其向基本情况靠近。改变状态是指修改算法所用的某些数据,使得实际问题的数据以某种方式变得更小。
③递归算法必须递归的调用自己——在定义的函数中如果使用了递归算法,则必须在函数用更具情况在此调用该函数。
3.递归算法的实际例子
接下来笔者将会利用文章中介绍的方法来解决一个实际的问题。便于读者能够更加深入的了解递归算法。
问题:
需要编写一个程序,实现将一个整数转换为2~16为基数的字符串(即输入一个整数,将该整数变为对应的“n”进制数,其中n的范围为2-16)。
例如:将输入整数10转换为二进制数字符串“1010”。我们知道十进制转换为二进制数据的方法是”除二取余“法。即用10除2,将余数保存起来,如果得到的商大于2就继续除2,继续保留余数....如此往复就可以得到十进制对应的二进制数。
根据以上的思路我们可以做一个推广,即一个十进制数变为n进制数,可以变为“除n取余法”。
注意事项:根据进制转换知识我们可以知道,除n取余法得到的余数,大于9的数据,需要用A,B,C,D,E,F代替10,11,12,13,14,15。
接下来笔者将使用递归算法解决上述问题(Python实现):
def tostr(n,base):
converstring="0123456789ABCDEF"
if n<base: #递归的结束标志
return converstring[n] #结束递归
else:
return tostr(n//base,base)+ converstring[n%base] #递归的范围缩小,且再次调用自身函数
print(tostr(10,2))
代码中的递归三要素:
①代码中的if语句就是递归算法的结束标志,因为当转换的整数小于基数,则不需要进行,取余运算。所以结束递归算法。
②在else情况中,当再次调用递归函数的时候,对传入参数进行了修改,这样就使得递归的范围缩小。
③在else语句中进行函数的再次调用。
运行结果: