一、题目分析
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.
设经过第n个村子时有count(n)只鸭子,卖了count(n)/2+1只鸭子,还剩下count(n+1)只鸭子,所以在经过这个村子时有coucnt (n)=count(n)/2+1+count(n+1)=2*(count(n+1)+1),经过第n个村子时卖出count(n)/2+1只鸭子,第(n+1)个村子剩下count(n+1)只鸭子,即题目中可以理解为count(8)=2,出发时有count(1)只鸭子。
count(n)=2*(count(n+1)+1); 1<n<8
countt(8)=2; n=8
针对1、除1以外的奇数、偶数进行不同的运算(并显示计算后结果)直到这个数成为自然数1结束运算,并且利用num对运算记录进行计数,利用函数回调实现输出功能。
num+=count(i*3+1); i为除1以外的奇数时
num+=count(i/2); i为偶数时
三、算法实现
1.
#include<iostream>
using namespace std;
int count(int n) //递归函数
{
if(n==8)
{
return 2;
}
else
{
return 2*(count(n+1)+1);
}
}
void main()
{
int i;
cout<<"出发前共赶了"<<count(1)<<"鸭子"<<endl;
for(i=1;i<8;i++){
cout<<"经过第"<<i<<"个村庄卖出"<<count(i)/2+1<<"只鸭子"<<endl; //调用递归函数
}
}
#include<iostream>
using namespace std;
int count(int i){ //递归函数
int num=0; //对过程进行计数的记录
cout<<i<<" ";
num++; //计数加一
if(i==1){ //i=1时
return num;
}
else if(i%2==0){ //i为偶数时
num+=count(i/2);
return num;
}
else { //i为除1以外的奇数时
num+=count(i*3+1);
return num;
}
}
int main()
{
int i=0;
cout<<"please input a number:"<<endl;
cin>>i;
cout<<"经过"<<count(i)<<"次得到自然数1"<<endl; //调用递归函数
return 0;
}
四、运行结果
1、
2、