在书上看到过归纳的使用递归调用解决问题的特点:
1,将原有的问题能够分解为一个新问题,而新问题又要用原有问题的解决方案,这便体现了递归。按照这一特点将问题分解下去,每次出现的新问题都是原问题简化的子问题,而种种分解出来的新问题是具有已知解的问题。
2,递归调用的过程可分为两个阶段:递推和回归。
3,递归调用通过递归函数来实现。
4.一般来说,可使用递归调用编写的程序都可用非递归调用来编写。
一,关于阶乘的递归调用(fact()函数是求n!的递归函数)
#include <iostream.h>
long int fact(int n);//(fact()函数递归调用之前的说明)
void main()
{
int n;
cout<<"Input a positive integer; ";
cin>>n;
long fa=fact(n);//(递归调用)
cout<<n<<"!="<<fa<<endl;
}
long int fact(int n)//(fact()函数的定义)
{
long int p;
if(n==0)
p=1;
else
p=n*fact(n-1);
return p;
}
例如将n值定为10得出程序运行的结果为:
二,关于最大公约数的递归调用(gcd1()是求两个整数的最大公约数)
#include <iostream.h>
long int gcd1(int x,int y);
void main()
{
int a,b;
cout<<"Input two number; ";
cin>>a>>b;
long g=gcd1(a,b);
cout<<g<<endl;
}
long gcd1(int x,int y)
{
if(x%y==0)
return y;
return gcd1(y,x%y);
}
将a和b值定为15和10的结果为:
对于此递归函数也可以采用非递归的编程方法:
#include <iostream.h>
long int gcd1(int x,int y);
void main()
{
int a,b;
cout<<"Input two number; ";
cin>>a>>b;
long g=gcd1(a,b);
cout<<g<<endl;
}
long gcd1(int x,int y)
{
int temp;
while(y!=0)
{
temp=x%y;
x=y;
y=temp;
}
return x;
}
同样的输入后结果为:
使用有限次的递归调用方法编写程序的额好处就是一般比其他的方法简短,可读性好。