常用算法之递归
递归:再调用一个函数的过程中又出现直接或间接地调用该函数本身,即自己调用自己。
注意在递归中,不能与 for 语句连用,会无限循环,内存会爆炸,并且在没有设定终止递归的条件时,该函数会进行无终止的递归调用,这可以用 if 语句来控制,以便达到想要的效果。
优缺点:
1.容易实现,简洁,清晰易懂;
2.相对于循环来说更浪费时间和空间;
例:
1)用递归法求阶乘:
#include<stdio.h>
int main()
{
double fac(int n);
int n;
double y;
scanf("%d",&n);
y=fac(n); //调用fac函数
printf("%d!=%lf\n",n,y);
return 0;
}
double fac(int n) //定义fac函数
{
double f;
if(n<0)
printf("n<0,error");
else if(n==0||n==1) //递归终止条件
f=1;
else f=fac(n-1)*n;
return(f);
}
2)汉诺塔问题
#include<stdio.h>
int main()
{
void hanoi(int n,char one,char two,char three); //对hanoi函数的声明
int m;
printf("input number:");
scanf("%d",&m);
printf("The step to move to %d:\n",m);
hanoi(m,'A','B','C'); //调用hanoi函数
}
void hanoi(int n,char one,char two,char three) //定义hanoi函数
{
void move(char x,char y); //调用move函数
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y) //定义move函数
{
printf("%c->%c\n",x,y);
}
3)全排列
#include<stdio.h>
void Swap(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}
void printPermutation(int a[],int k,int n)
{
if(k==n) //打印数组
{
for(int i=1;i<n+1;++i)
{
printf("%d",a[i]);
}
printf("\n");
}
else
{
for(int i=k;i<n+1;++i)
{
Swap(&a[k],&a[i]); //交换
Swap(&a[k],&a[i]);
printPermutation(a,k+1,n);
Swap(&a[k],&a[i]); //回溯(变回交换前的结果)
}
}
}
int main()
{
int a[10],n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
a[i]=i;
}
printPermutation(a,1,n);
return 0;
}