1, 题目分析
1、问题描述; 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
分析:卖家在经过七个村子后剩下2只鸭子,令duck=2,他在每个村子卖出总数的一半还多一只,则可以求得第i个村子共有鸭子duck=(duck+1)2,在第i个村卖了x=duck/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
STEP=16
分析:设一个计数变量count,输入数字a,判断a是否等于0,若是,则计数加一,输出x,递归结束,否则判断x是否偶数,是偶数则计数加一,输出x,然后x=x/2,是奇数计数加一,输出x,然后x=x3+1。
2、算法分析
对第一个问题,卖家在经过七个村子后剩下2只鸭子,令duck=2,他在每个村子卖出总数的一半还多一只,则可以求得第i个村子共有鸭子duck=(duck+1)*2,在第i个村卖了x=duck/2+1只鸭子。
总数:duck=(duck+1)
duck=(duck+1);x=duck/2+1 0<i<8 (递归体函数)
duck=duck i-0 (递归出口)
对第二个问题,设一个计数变量count,输入数字a,判断a是否等于0,若是,则计数加一,输出x,递归结束,否则判断x是否偶数,是偶数则计数加一,输出x,然后x=x/2,是奇数计数加一,输出x,然后x=x3+1。
输出x和count x1 (递归出口)
x=x/2 x%20 (递归函数)
x=x3+1 x%2!=0
3、源程序
#include<iostream>
using namespace std;
int duck=2; //全局变量
int main()
{
int N(int);
N(7);
return 0;
}
int N(int i) //递归函数
{
int x;
if(i==0) //出口
{
cout<<"鸭子总数是:"<<duck<<endl;
}
else
{
duck=(duck+1)*2; //递归体
x=duck/2+1;
cout<<"在第"<<i<<"个村子卖了"<<x<<"个鸭子"<<endl;
i--;
return N(i);
}
}
#include<iostream>
using namespace std;
void V(int x) //递归函数
{
int static count=0;
if(x==1) //出口
{
count++;
cout<<x<<endl;
cout<<"总步数是:"<<count<<endl;
return;
}
else //递归体
{
if(x%2==0)
{
cout<<x<<"\t";
count++;
x=x/2;
}
else
{
cout<<x<<"\t";
count++;
x=x*3+1;
}
}
V(x); //递归调用
}
int main()
{
int a;
cout<<"请输入一个数用于求角谷数:"<<endl;
cin>>a;
V(a);
return 0;
}