#include <stdio.h>
#include <stdlib.h>
int f(int m)
{
if(m==1)
return 4;
else
return (f(m-1)-1)*2;
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%d\n",f(m));
}
return 0;
}
思路:递归:自己调用自己
递归的基本思想:把规模大的问题转化为规模小的相似的子问题来解决
使用递归需要
1有反复执行的过程(调用自身)
2有跳出反复执行过程的条件(递归出口)
使用递归的缺点
1递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。
2在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。因此一般不提倡用递归算法设计程序。
经典案例
①斐波纳契数列(Fibonacci Sequence)
详看:http://blog.csdn.net/joeycom2/article/details/51095887
②n的阶乘
#include <stdio.h>
#include <stdlib.h>
int f(int m)
{
if(m==1)
return 1;
else
return f(m-1)*m;
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%d",&m);
printf("%d\n",f(m));
}
}
return 0;
}
③列出某个目录下所有的子目录和文件
详看: http://bbs.csdn.net/topics/390153108
造诣还不够@。@还没看懂,先记着以后看吧T_T
④汉诺塔问题
问题描述: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。
解决汉诺塔问题的思路:
如果只有一个金片,则把该金片从源移动到目标棒,结束。
如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒。
对于汉诺塔问题的求解,可以通过以下三个步骤实现:
将塔A上的n-1个碟子借助塔C先移到塔B上。
把塔A上剩下的一个碟子移到塔C上。
将n-1个碟子从塔B借助塔A移到塔C上。
贴上视频:http://v.youku.com/v_show/id_XMzgzOTEzNjMy.html
上代码:
#include <stdio.h>
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
int i=1;//记录步数
void move(int n,char from,char to) //将编号为n的盘子由from移动到to
{
printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)
{
if (n==1)
move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else
{
hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n,from,to); //将剩下的一个盘子移动到目的塔上
hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
void main()
{
printf("请输入盘子的个数:\n");
int n;
scanf("%d",&n);
char x='A',y='B',z='C';
printf("盘子移动情况如下:\n");
hanoi(n,x,y,z);
}
后面 的递归参考自http://blog.csdn.net/wangjinyu501/article/details/8248492