所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。

递归分为直接递归和间接递归:简而言之,在函数中直接调用函数本身,称为直接递归调用。在函数中调用其它函数,其它函数又调用原函数,这就构成了函数自身的间接调用称为间接递归调用。

利用递归算法解题,首先要对问题的以下三个方面进行分析: 一、决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。二、问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。三、解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。

简单地说,函数下一次的参数是函数自身上一次的输出值,也就是说,函数的下一次执行取决于上一次的结果,即自身依赖。如求阶乘算法:

 #include <stdio.h>

 float fun(float n)
{
if (n<)
{
exit(-);
}
else if (n==||n==) //退出条件
{
return ;
}
else
return n*fun(n-); //递归调用 } void main(void)
{
int n;
printf("请输入数(n!):\n");
scanf("%d",&n);
printf("%.f",fun(n)); //不显示小数部分的输出
return;
}

我们从递归函数fun中,可以得到:1)必须有退出条件(if);2)每次调用参数不同,但有一定的规律民(n-1);3)自身的输出作为自身的输入return。

 #include <stdio.h>
#include <string.h>
void fun(char *s, int n, int b)
{
char bit[]={"0123456789ABCDEF"};
int len;
if(n==)
{
strcpy(s,"");
return;
}
fun(s, n/b, b);
len = strlen(s);
s[len] = bit[n%b];
s[len+] = '\0';
} void main(void)
{
char s[];
int i, base,old;
printf("请输入十进制数:");
scanf("%d",&old);
printf("请输入转换的进制:");
scanf("%d", &base);
fun(s, old, base);
printf("%s\n", s); return;
}

我们从递归函数fun中,可以得到:1)必须有退出条件,函数;2)每次调用参数不同,但有一定的规律民(n/b);3)逆向结果处理。

经典例子:

1 求全排列

   #include<stdio.h>
#define SWAP(a,b,t) ((t)=(a),(a)=(b),(b)=(t)) //求全排列,list存放着要排列的的数据,i控制着排列的结束,
//如果第一次调用,一般为0,n是list中数据的大小,或长度。
void perm(char *list,int i,int n)
{
int j;
int temp;
if(i == n) //一个全排列已经完成,打印整个排列
{
for(j = ; j <=n; j++)
{
printf("%c",list[j]);
}
printf("\n");
}
else
{
for(j = i; j <= n; j++)
{
SWAP(list[i],list[j],temp); //依次将1,2,...n个元素放在第一个位置
perm(list,i+,n); //递归进行全排列
SWAP(list[i],list[j],temp); //由于第一个SWAP将第j个元素放到第一个位置进行了
//递归全排列,这里就将列表还原,以进行第2次递归
}
}
} int main()
{
char list[] = {'a','b','c'};
perm(list,,);
return ;
}

2斐波那契数列

又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每一项都等于前两项之和。又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

   #include<stdio.h>
int fun(int n)
{
if(n==||n==)
{
return ;
}
else
return fun(n-)+fun(n-);
} int main()
{
int n;
printf("please input month number\n");
scanf("%d",&n);
printf("%d\n",fun(n)); return ;
}

3 汉诺塔

4求一组整数中的最大(小)值(整数是一个int[]数组,个数未知)。

参考资料

递归算法及经典递归例子代码实现

最新文章

  1. iOS-----写一个规范的单例---&gt;
  2. SWFUpload - JQuery上传插件
  3. Centos 6.5 SNMP客户端安装及配置版本net-snmp-5.7.3
  4. maven安装nexus私服
  5. input多选计算
  6. springMVC配置(XML配置详解)
  7. MATLAB信号与系统分析(三)&mdash;&mdash;连续信号与系统的复频域分析及MATLAB实现
  8. XP极限编程
  9. /bin/bash: [xxxx]: command not found
  10. linux标准输入输出重定向
  11. Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子
  12. Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask
  13. OpenCV中的结构体、类与Emgu.CV的对应表
  14. ActiveMQ 学习第二弹
  15. extends Thread 与 implements Runnable 的区别
  16. django 视图函数返回queryset对象或日期对象至浏览器ajax接收的写法
  17. tail语法
  18. 如何在Maven官网下载历史版本
  19. Spring cloud consul 相关前提知识
  20. HTTP 协议基础

热门文章

  1. 2012第二届GIS制图大赛——公开课技术问题&amp;答疑(珍贵资源哦!)(http://blog.csdn.net/arcgis_all/article/details/8216984)
  2. [改善Java代码]小心switch带来的空值异常
  3. Win10开机小键盘不亮解决办法
  4. asp.net mvc开发的社区产品相关开发文档分享
  5. 把mvc4彻底搞定(一)
  6. js和jQuery创建元素和把元素插入到文档中所用的方法
  7. 第五十四篇、OC利用AFN上传上传语音
  8. HTML+CSS学习笔记(1) - Html介绍
  9. abstract
  10. OC11_自动释放池