递归最重要的两个概念:
- 逻辑边界
- 递归式
1、N的阶乘
逻辑边界:F(0)=1
递归式:F(x)=x*F(x-1)
#include <stdio.h>
#include <string.h>
int F(int x){
if (x==0)
return 1;
return (x*F(x-1));
}
int main(){
printf("%d",F(4));
return 0;
}
2、Fibonacci数列
逻辑边界:F(0)==F(1)=1
递归式:F(x)=F(x-2)+F(x-1)
#include <stdio.h>
#include <string.h>
int F(int x){
if (x==0||x==1)
return 1;
return (F(x-2)+F(x-1));
}
int main(){
printf("%d",F(4));
return 0;
}
3、全排列
从递归的角度看问题,把问题“输出从1-5的全排列”分为若干个子问题,输出以“1”,“12”开头的全排列就好简单了。
不妨设数组P[x],用来存放当前的排列,则设定一个hashTable[x]来判断x是否已经在P数组
现在已经放了P[1]到P[index-1],准备添放P[index],显然需要枚举出1-n,看谁还没有在P中,将最小的放入P【index】中,同时将hashTable[x]改成true,递归结束后,改为false。
递归边界就是index==n+1,所有的元素都满了之后,输出结果;
#include <stdio.h>
#include <string.h>
const int maxn=11;
int stu=0;
bool hashTable[maxn]={false};
int n,P[maxn];
void generateP(int x){
if (x==n+1){
for (int j=1;j<=n;j++){
printf("%d",P[j]);
}
printf("\n");
stu++;
return;
}
for (int z=1;z<=n;z++){
if (hashTable[z]==false){
P[x]=z;
hashTable[z]=true;
generateP(x+1);
hashTable[z]=false;
}
}
}
int main(){
n=3;
generateP(1);
printf("%d",stu);
return 0;
}
4、N皇后问题
与全排列问题类似,只是边界不一样,需要判断是否为同一列
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
const int maxn=11;
int stu=0;
bool hashTable[maxn]={false};
int n,P[maxn];
void generateP(int x){
if (x==n+1){
stu++;
return;
}
for (int z=1;z<=n;z++){
if (hashTable[z]==false){
bool flag=1;
for (int oppo=1;oppo<x;oppo++){
if (abs(P[oppo]-z)==abs(oppo-x))
{flag=0;
break;
}
}
if (flag==1){
P[x]=z;
hashTable[z]=true;
generateP(x+1);
hashTable[z]=false;
}
}
}
}
int main(){
n=8;
generateP(1);
printf("%d",stu);
return 0;
}
5、最大公约数
递归式:gcd(a,b)==gcd(b,a%b)
逻辑边界:a%b==0
#include <iostream>
using namespace std;
int gcd(int a,int b){
if (a%b==0)
return b;
return gcd(b,a%b);
}
int main(){
int a, b;
while(1){
cin>> a>>b;
cout<<gcd(a,b);
}
return 0;
}
5408

被折叠的 条评论
为什么被折叠?



