递归法

一、递归法 的基本概念
在广义表、二叉树和AVL数的算法设计中大量的用到递归法,递归算法设计需要递归数据结构和递归运算。实际上,大量的数据都是递归定义,如正整数就是这样定义的:1是正整数,如果n是正整数,则n+1也是正整数。实数是由正整数导出的,所以实数等都是递归数据结构。


递归算法通常有这样的特征:为求解规模为N的问题,设法将它分解成一些规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些更小问题的解构造出规模稍大的问题的解。特别地,当规模N=1时,能直接得到解。这样的求解算法就可用递归来描述,如后面要叙述的回溯法和分治法。
递归设计先要给出递归模型,在转换成对应的C/C++算法。由此得出递归算法的步骤如下:

①对原问题f(s)进行分析,假设出合理的“较小问题”f(s');
②假设f(s')是可解的,在此基础上确定f(s)的解,即给出f(s)与f(s')之间的关系;
③确定一个特定情况(如f(1)或f(0))的解,由此作为递归的出口。

 

递归 (计算机科学) ”一词在wiki百科 中的定义如下:

在计算机编程 里,递归 指的是一个过程:函数 不断引用自身,直到引用的对象已知。

使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。

汉诺塔问题,是常见可用递归解决的问题,不过也有非递归的解法。

菲波纳契数列 可用递归定义。

 

 

二,简单实例

例题一:用递归法求一个整数数组中所有元素的平均值。

解:设f(i)为a[0..i-1]即数组a的前i个元素的平均值。显然f(1)=a[0],假设f(i-1)即前i-1个元素的平均值已求出,则f(i)=((i-1)*f(i-1)+a[i-1])/i,由此得递归模型如下:

①f(i)=a[0]  当i=0时

②f(i)=((i-1)*f(i-1)+a[i-1])/i  当i>0时

 

对应的递归算法如下:

 

 

例题二:设计一个算法求出从自然数1,2,...,m中任取k个数的所有组合。

 

对应的递归模型如下:

①f(m,k):输出一个解  当k=1时

②f(m,k):for(i=m;i>=k;i--){a[k]=i;f(i-1,k-1)} 当k>1时

 

C++实现如下:

 

输入n,r(r<=n):4 3
输出所有组合:
        4 3 2
        4 3 1
        4 2 1
        3 2 1
请按任意键继续. . .

 

三,更多 实例(持续更新 )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值