怎么判断一个问题是不是递归的

 

递归,怎么理解这个概念?我们不需要用复杂的语言来描述这个概念,只需要从这个词的本意入手即可。递归的英文也就是recursion,这个词的词源是recur,我们都知道occur的意思是发生,那么recur的意思也就不难理解了,也就是重复发生。所以说,递归,就是指一个事情周期性重复发生,也就是说,在一个算法里,如果一个方法被重复调用,那么这个方法就有可能是递归的。

 

那么怎么判断一个问题是否能用递归的方法来解?这可以从三方面去考虑。

 

1.       这个问题的定义是不是递归的?

比较典型的就是Fibonacci数列和阶乘问题,这两个问题本身都包含了递归的过程,因此很容易判断出可以用递归法去解。

 

2.       数据本身是不是递归的?

这类情况中,比较典型的是链表和二叉树。判断一个数据是不是递归结构,关键点在于局部数据和全局数据的结构是不是一样的,拿单向链表来说,每一个节点都有一个数据,一个指向它的指针和一个指向下一个节点的指针,而整个链表也是这种结构,因此链表是递归结构。而对于二叉树则是一个道理,二叉树的任意一棵子树都和它本身具备相同的结构。因此,操作这类数据都可以选择递归。

 

3.       问题的解法是不是递归的?

这种情况稍难判断一点,需要程序员在自己的脑中模拟一下问题的解决过程,从而找出递归关系。最经典的例子莫过于汉诺塔,在移动盘子的过程中,每一次移动底层盘子,都需要把上层的盘子移开,而每次移动的方法又都是相同的,因此是比较典型的递归问题。

 

在各种算法教材上几乎都把递归作为第一个介绍的算法,但是个人认为递归其实并不是那么好理解,想正确的判断出递归,并且应用递归,是需要大量练习的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值