一.题目描述
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
二.递归设计
1.卖鸭子
递归函数
duck(n)={
2 n=0;
2*(duck(n-1)+1) n>0
}
2.角谷定理
递归函数:
js(int n)={
跳出循环 n=1
js(n) n!=1
}
三.代码实现
1.卖鸭子
#include<iostream>
using namespace std;
int duck(int n)
{
if(n==0)
return 2;
if(n>0)
return
2*(duck(n-1)+1);
}
int main()
{
int rest,sale,sum,i;
int n=7;
sum=duck(n);
cout<<sum<<endl;
for(i=7;i>=1;i--)
{
sum=duck(i);
sale=sum/2+1;
rest=sum-sale;
cout<<"进入第"<<(8-i)<<"个村庄,卖出了"<<sale<<"只鸭子,还剩"<<rest<<"只鸭子"<<endl;
}
}
2.角谷定理
#include<iostream>
using namespace std;
//角谷猜想
int count=1;
void js(int n)
{
cout<<n<<"
";
if(n%2!=0)//为奇数时
{
n=n*3+1;
}
else if(n%2==0)//为偶数时
{
n=n/2;
}
count++;
if(n!=1)
js(n);
else if(n==1)
{
cout<<n<<endl;
cout<<"计算次数"<<count<<endl;
}
}
int main()
{
int n;
cout<<"输入数字:";
cin>>n;
js(n);//调用函数
}
四.实验总结
这次上机是有关递归问题,递归是编程常见的一种算法,没有开始自己编程前,总觉得还是容易理解和运用的,但实际遇到各种小问题,递归出口没找对,陷入死循环等,所以,递归最重要的是找到终止条件和循环体,比如第一个题终止条件就是当天数减为0,返回一个值,跳出循环。掌握了构造递归算法的方法技巧。