递归概念
简单的说:递归就是方法自己调用自己 ,每次调用时传入不同的变量 。可以用来代替循环(例如N皇后例题)。递归有助于编程者解决复杂的问题 ,同时可以让代码变得简洁。我认为递归的关键在于圈定范围,考虑清楚边界问题。下面来看一些简单案例。
1、求n的阶层
题目详情
自己输入一个数,求n的阶层。
输入
3
输出
6
详细代码
#include<iostream>
using namespace std;
int Oil( int n)
{
if(n==0)
return 1;
else
return n*Oil(n-1);
}
int main()
{
int a;
cin>>a;
int c;
c=Oil(a);
cout<<c;
}
这是最简单的递归类型,也是基础。利用不断调用N来算结果,给它最后圈定一个范围n=0时直接终止。
2、汉诺塔问题
题目描述
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按照大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
代码详情
#include<iostream>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)
//以mid为中转,将src上的n个盘子移动到dest座
{
if(n==1)
{//之移动一格盘子
cout<<src<<"->"<<dest<<endl;
//直接将盘子移动到dest
return ;
}
Hanoi(n-1,src,dest,mid);
//先将n-1个盘子移动到mid
cout<<src<<"->"<<dest<<endl;
//再将一个盘子从src移动到dest
Hanoi(n-1,mid,src,dest);
//最后将n-1个盘子从mid移动到dest
return ;
}
int main()
{
int n;
cin>>n;//输入盘子数
Hanoi(n,'A','B','C');
return 0;
}
思路
本质上只有散三步骤:
第一步:把n-1个盘子(最大盘子以上的盘子)移动到B上,
第二步:把第N个盘子(最大的盘子)移动C上
第三步:然后把n-1个盘子(最大盘子以上的盘子)移动C上;
然后通过调用栈来实现递归。
3、逆波兰表达式
代码详情
#include<iostream>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
double exp()
{
//读入一个逆波兰表达式,并计算其值
char s[20];
cin>>s;
switch(s[0])
{
case '+': return exp()+exp();
case '-': return exp()-exp();
case '*': return exp()*exp();
case '/': return exp()/exp();
default: return atof(s);
}
}
int main()
{
printf("%lf",exp());
return 0;
}
注意要了解atof函数
atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’\0’)才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。返回值返回转换后的浮点型数。
jsj 201 qyj