递归算法详细解析——附带具体案例

 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语句中进行函数的再次调用。

运行结果:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值