(1)编写递归函数求出n的阶乘(自定义main函数,调用定义的递归函数)
#include<iostream>
using namespace std;
int fac(int x);
int fac(int x)
{
int n;
if(x==0) n=1;
else n=fac(x-1)*x;
return n;
}
int main()
{
int n,m;
cin>>n;
m=fac(n);
cout<<m<<endl;
return 0;
}
(2)写出求1*3*...*n的递归式,并编写出递归函数求解。
</pre><pre class="cpp" name="code">#include<iostream>
using namespace std;
int fac(int x)
{
int n;
if(x==1) n=1;
else n=fac(x-2)*x;
return n;
}
int main()
{
int m,n;
cout<<"输入一个数:"<<endl;
cin>>n;
if(n%2==0)
n=n-1;
m=fac(n);
cout<<"奇数乘积是"<<m<<endl;
return 0;
}
(3)编程序,用递归函数求出两个数的最大公约数。(包括编main函数,调用定义的递归函数)
#include<iostream>
using namespace std;
int fac(int x,int y)
{
int m,n;
int temp;
if(x<y)
{
temp=x;x=y;y=temp;
}
if(y==0)
m=x;
else
{
n=x%y;
m=fac(y,n);
}
return m;
}
int main()
{
int m,n,p;
cout<<"输入两个数:"<<endl;
cin>>m>>n;
p=fac(m,n);
cout<<"最大公约数是"<<p<<endl;
return 0;
}
(4)编制递归函数fib(int n)返回第n个Fibnacci数,以此输出Fibnacci序列的第20个数。
#include<iostream>
using namespace std;
int m=1;
int fib(int n)
{
if(n==1)
return 1;
else if(n==2)
return 1;
else
return(fib(n-1)+fib(n-2));
}
int main()
{
int n,m;
cout<<"输入数列中的第n个数:"<<endl;
cin>>n;
m=fib(n);
cout<<"第"<<n<<"个数是:"<<m<<endl;
return 0;
}
(5)输入一个整数n,要求输出对应的二进制形式,请用递归函数实现。
#include<iostream>
using namespace std;
int bina(int n)
{
int m,a;
m=n%2;
a=n/2;
if(n==0)
return 0;//终止条件
bina(a);
cout<<m;
return m;
}
int main()
{
int n;
cout<<"输入一个数:";
cin>>n;
bina(n);
cout<<endl;
}
(6)汉诺塔
#include<iostream>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
if(n==1)
cout<<A<<"->"<<C<<endl;
else
{
hanoi(n-1,A,C,B);
cout<<A<<"->"<<C<<endl;
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
cin>>n;
hanoi(n,'A','B','C');
return 0;
}
心得:递归算法还是不熟悉,就这五个题还是花了好几个小时才写完,递归的时候总是忘记写终止条件,程序也就一遍一遍的崩溃,找不到原因的时候,心里还是特别烦躁,反正觉得,从现在开始,后面的问题也就没有之前的那么简单了,之前的不用看参考也能写出个大概,但汉诺塔的意思虽然知道,单用程序就让我很难下手,再看了好几遍理解才弄了个大概,还得一步一步慢慢来。