递归:一个函数调用其自身函数
例题1 求阶乘
/**
求阶乘问题
*/
#include<iostream>
using namespace std;
int Factorial(int n)
{
if(n==0)
return 1;
return n*Factorial(n-1);
}
int main()
{
int n;
cin>>n;
cout<<Factorial(n);
return 0;
}
例题2 汉诺塔问题
古代有一个梵塔,塔内有三个座A,B,C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。
/**
汉诺塔问题
*/
#include<iostream>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)
{
if(n==1)
{
cout<<src<<"->"<<dest<<endl;
return;
}
Hanoi(n-1,src,dest,mid);
cout<<src<<"->"<<dest<<endl;
Hanoi(n-1,mid,src,dest);
return;
}
int main()
{
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}
例题3:n皇后问题
输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。
输入:
输入一个正整数N,则程序输出N皇后问题的全部白发。
输出:
输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。
皇后的行、列编号都是从1开始算。
样例输入:4
样例输出:
2 4 1 3
3 1 4 2
/**
n皇后问题
这里采取了回溯法
*/
#include<iostream>
#include<math.h>
#define maxsize 100
using namespace std;
int n;
int x[maxsize];
//检测第k个是否与前k-1个冲突
int nocollision(int k)
{
int j=1;
while(j<k)
{
if(x[j]==x[k]||(abs(x[j]-x[k]))==abs(j-k))
return 0;
j++;
}
return 1;
}
void place(int k,int n)
{
if(k>n)
{
for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
for(int i=1;i<=n;i++)
{
x[k]=i;
if(nocollision(k))
place(k+1,n);
x[k]=0;
}
}
int main()
{
cin>>n;
place(1,n);
return 0;
}
例题四:逆波兰表达式
逆波兰表达式的定义:一个数是一个逆波兰表达式,值为该数。“运算符 逆波兰表达式 逆波兰表达式”是逆波兰表达式,值为两个逆波兰表达式的值运算的结果。
atof(),是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。该函数名是 “ascii to floating point numbers” 的缩写。语法格式为:double atof(const char *nptr)。
/**
逆波兰表达式
*/
#include<iostream>
#include<stdlib.h>
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);
break;
}
}
int main()
{
cout<<exp()<<endl;
return 0;
}