一.题目
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个村庄,共有X(n)只鸭子。在第一个村庄卖了X(n1)=(X(n)/2+1)只鸭子,在第二个村庄卖鸭子的数量为:X(n2)=(X(n)-X(n1))/2+1……以此类推,可得出:X(n-1)=(X(n)+1)*2。
递归出口为:X(7)=2; n=7
递归体为:X(n-1)=(X(n)+1)*2。n<7
2.题目分析:对于前面的判断是奇数还是偶数,然后进行相关的操作,这个相对容易。对于有限次运算之后,后面进行总可以得到自然数值1,这个就是用递归去实现。每次判断完就次数加1。
递归出口:输出次数以及对应的num, num=1
递归体为:Theory(num,count), num!=1
三.完整代码
1.Java:
public class DuckSum {
public static void main(String[] args) {
int sum=0;//鸭子总数
int village=7;
sum=Duck(village);
System.out.println("一共有"+sum+"只鸭子。");
int sale;//卖出去的鸭子数
int rest;//剩余的鸭子数
for(int v=7;v>=1;v--){
sum=Duck(v);
sale=sum/2+1;
rest=sum-sale;
System.out.println("进入第"+(8-v)+"个村庄,卖了"+sale+"只鸭子,剩余"+rest+"只鸭子!");
}
}
public static int Duck(int count){
if(count==0){
return 2;
}else{
count--;
return (Duck(count)+1)*2;
}
}
}
c++:
#include<iostream>
using namespace std;
//定义递归算法
int Duck(int count)
{ //count其实就是村子的总数
if(count==0){
//当所有村子都走完
return 2;
}else{
count--;
return (Duck(count)+1)*2;
}
}
//主函数 int main()
{
int sum=0;//鸭子总数
int village=7;//村子总数
sum=Duck(village);
cout<<"一共赶了"<<sum<<"只鸭子!"<<endl;
int sale;//卖的鸭子数
int rest;//剩余的鸭子数
for(int count=7;count>=1;count--){
sum=Duck(count);
sale=sum/2+1;
rest=sum-sale;
cout<<"经过第"<<8-count<<"个村庄时,卖了"<<sale<<"只鸭子,还剩余"<<rest<<"只鸭子。"<<endl;
}
return 0;
}
2.Java:
import java.util.Scanner;
public class 角谷定理 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int num=in.nextInt();
System.out.println("下面是每一次运算后的结果:"+"\n");
Theory(num,1);
}
public static void Theory(int num,int count){
System.out.println(num);
if(num%2==0)//num为偶数
num/=2;
else if(num%2!=0&&num!=1)//num为奇数
num=num*3+1;
count++;
if(num!=1)//若结果不为1,就继续递归函数,直到为1结束
Theory(num,count);
else if(num==1){//若结果为1,就输出次数以及num
System.out.println(num);
System.out.println("一共有"+count+"次!");
}
}
}
c++:
#include<iostream>
using namespace std;
void Theorem(int num,int count)
{ //count为次数
cout<<num<<endl;//将每次运算前的结果输出来
if(num%2==0)//num为偶数
num=num/2;
else if(num%2!=0&&num!=1)//num为奇数
num=num*3+1;
count++;
if(num!=1)//如果结果不等于1,继续运算
Theorem(num,count);
if(num==1){//如果为1,则输出结果
cout<<num<<endl;
cout<<"次数为"<<count<<endl;
}
}
int main(){
int num;
cin>>num;//输入一个数
cout<<"下面就是每运算一次的结果:"<<endl;
Theorem(num,1);
return 0;
}
四.调试
1.
2.
五.测试
1.c++
2.c++
最后,可能过程不尽完善,望采纳!有批评意见请指出!!!