一、 题目内容
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
二、 题目分析
- 题目1
递归方法:
定义返回值为整数型的方法为作为递归方法,第一个参数i为此时的鸭子数,第二个参数count为此时递归的次数。递归出口为count次数达到7,说明此时经过7个村庄,所以此时应跳出循环,返回递归次数。否则将第一个参数用(i+1)*2作为第一个参数继续返回该方法。
非递归方法:
用while循环,用count作为计算经过的村庄数量,同时计算循环次数。当判断条件count<7时,进入循环。在循环体中,令鸭子数i的值变为(i+1)*2。同时count+1. - 题目2
递归方法:
定义递归方法,返回值为整数型,第一个参数i作为最初的自然数,第二个参数count作为计数变量,计算递归的次数。每次进入该方法时,count++。当i=1时,作为递归出口,返回计数结果。否则判断i的值,若为奇数,返回该方法,将第一个参数变为i3+1.若为偶数,返回该方法,将第一个参数变为i/2。
非递归方法:
用while循环。判断条件为i不等于1,循环体中判断i的值为奇数还是偶数。若为奇数,将i的值变为i3+1,若为偶数,将i的值变为i/2。每次循环后count变量+1.
三、 算法实现
题目1(递归)
public static int fun(int i,int count){
//递归出口 计数器count==7,得到最初的鸭子数,此时输出鸭子数
if(count==7){
sum=i;
System.out.println("出发时有"+sum+"只鸭子");
return i;
}
else {
count++;
if(count<8)
//当计数器<8时,未经历7个村庄 所以继续进入递归 并输出此时村庄号数 和 鸭子数
System.out.println("第"+(8-count)+"个村庄卖出"+((i+1)*2-i)+"只鸭子");
//返回自身 并将鸭子数用(i+1)*2表达式 计算出上一个村庄时的鸭子
return fun((i+1)*2,count);
}
}
题目1(非递归)
//从 count=0时开始循环, 每次循环令i=(i+1)*2;得到上一个村庄时的鸭子数,用((i+1)*2-i)表达式计算出这个村庄买了多少鸭子
while(count<7){
count++;
System.out.println("第"+(8-count)+"个村庄卖出"+((i+1)*2-i)+"只鸭子");
i=(i+1)*2;
}
System.out.println("出发时有"+i+"只鸭子");
题目2(递归)
public static int f(int i,int count){
count ++; //每次调用递归方法时,计数器+1
//当i为1时,作为递归的出口。此时不再调用自身,并且输出最后一个数 和计数器的值
if(i==1){
System.out.println(i+" ");
System.out.println(count);
return count;
}
//当i为奇数且i不等于1时,输出这个数,并进入递归,将第一个参数变为i*3+1
else if((i%2)!=0&&i!=1){
System.out.print(i+" ");
return f(i*3+1,count);
}
//当i为偶数时,输出这个数,再次调用自身,将第一个参数变为i/2
else if(i%2==0){
System.out.print(i+" ");
return f(i/2,count);
}
else {
return 0;
}
}
题目2(非递归)
//若n不等于1,则一直循环
while(n!=1){
//如果n为奇数,将n的值变为n*3+1,同时count+1.输出这个数
if((n%2)!=0){
count++;
System.out.print(n+" ");
n=n*3+1;
}
//如果n为偶数,将n的值变为n/2,同时count+1.输出这个数
else if((n%2)==0){
count++;
System.out.print(n+" ");
n=n/2;
}
}
运行截图