一:实验目的
1.掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计;
2.掌握递归程序转换为非递归程序的方法。
二:实验内容
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
三、流程图
内容二:
四:代码部分
内容一:
#include<iostream>
using namespace std;
class duck
{
public:
int hamlet; //统计村子数量
int i;
duck()
{
hamlet=7;
i=2;
}
int home()
{
i=(i+1)*2;
cout<<"第"<<hamlet<<"个村子卖了"<<i/2+1<<"个鸭子"<<endl;
hamlet--;
while(hamlet!=0)
{
home();
}
// if(hamlet==0)cout<<"刚开始有"<<i<<"只鸭子"<<endl;
return 0;
}
};
void main()
{
/*
jiaogu exam1;
exam1.home();
exam1.doit();
cout<<"step="<<exam1.i<<endl;
*/
duck exam2;
exam2.home();
cout<<"刚开始有"<<exam2.i<<"只鸭子"<<endl;
}
内容二:
#include<iostream>
using namespace std;
class jiaogu
{
public:
int i;
int m;
jiaogu()
{
i=1;
m=0;
}
int home()
{
cout<<"请输入一个自然数"<<endl;
cin>>m;
while(m<0)
{
cout<<"请按照要求输入"<<endl;
cin>>m;
}
return 0;
}
int doit()
{
if(m!=1)
{
if(m%2==0) m=m/2;
else m=m*3+1;
cout<<m<<endl;
i++;
}
while(m!=1)
{
doit();
}
return 0;
}
};
void main()
{
while(1)
{
jiaogu exam1;
exam1.home();
exam1.doit();
cout<<"step="<<exam1.i<<endl;
}
}
五:遇到的问题及解决办法
问题一:
i的值没有初始化
调试查看发现初始化函数出错了,及时做了修改
六:收获及总结
虽然本次用了面向对象的方法,但是还是运用的面向过程的思维。所以我用C++语言完成本次实验。
通过这2个案例,函数如果递归调用到了本身,就如同回到函数跳回到刚开始一样,达到条件后方可退出循环。通过函数的递归调用,可大大减少代码的数量,提高代码的质量,并且让程序更加清晰可读;但这同时也意味着程序制作者有着更加清晰的思路去解决所遇到的问题。