一、题目分析
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.卖鸭子递归算法
定义一个函数fun(int k,int i),变量k用于记录经过的村庄的次数,i表示经过此村庄时剩余的鸭子数,调用时赋予实参fun(1,2)。
递归出口:当k=8时,输出i,结束递归。
递归表达式:
if(k<=7) {
k++;
i=(i+1)*2;
return fun(k,i);
}
else {
return i;
}
2.卖鸭子非递归算法
使用一个七次循环的语句
Int i=7;
while(i>0) {
sum=(sum+1)*2;
}
3.角谷定理递归算法
定义一个函数run(int temp,int sum),temp表示需要处理的数据(也就是你输入的数据或者是经过角谷定理得到的数据),通过主函数调用键盘输入函数后将此数据作为实参调用此函数。
递归出口:当temp=1时,结束递归。
递归表达式:
if(temp!=1) {
if(temp%2==0) {
temp=temp/2;
sum++;
return run(temp,sum);
}
else {
temp=temp*3+1;
sum++;
return run(temp,sum);
}
}
else {
System.out.println();
System.out.println("一共经过了"+sum+"次得到1");
return 0;
}
}
4.角谷定理非递归算法
调用一个while循环
while(sum!=1) {
if(sum%2==0) {
sum=sum/2;
}
else {
sum=sum*3+1;
}
}
三、算法实现(程序源代码)
1.卖鸭子递归算法
public class fun {
public static int fun(int k,int i) {
int l=0;
int t=0;
if(k<=7) {
k++;
i=(i+1)*2;
l=9-k;
t=i/2+1;
System.out.println("经过第"+l+"个村子时卖出了"+t+"只鸭子");
return fun(k,i);
}
else {
return i;
}
}
public static void main(String []args) {
int sum=fun(1,2);
System.out.println("出发时一共有"+sum+"只鸭子\n");
}
}
2.卖鸭子非递归算法
public class run {
public static void main(String[]args) {
int i=7;
int sum=2;
int temp=0;
while(i>0) {
sum=(sum+1)*2;
temp=sum/2+1;
System.out.println("经过第"+i+"个村子时卖出了"+temp+"只鸭子");
i--;
}
System.out.println("出发时一共有"+sum+"只鸭子");
}
}
3.角谷定理递归算法
import java.util.Scanner;
public class run {
static Scanner scanner=new Scanner(System.in);
public static int run(int temp,int sum) {
System.out.print(temp+"\t");
if(temp!=1) {
if(temp%2==0) {
temp=temp/2;
sum++;
return run(temp,sum);
}
else {
temp=temp*3+1;
sum++;
return run(temp,sum);
}
}
else {
System.out.println();
System.out.println("一共经过了"+sum+"次得到1");
return 0;
}
}
public static void main(String[]args){
System.out.println("请输入一个整数");
int temp=scanner.nextInt();
run(temp,1);
}
}
4.角谷定理非递归算法
import java.util.Scanner;
public class run {
static Scanner scanner=new Scanner(System.in);
public static void main(String[]args) {
System.out.println("请输入一个数据");
int sum=scanner.nextInt();
int temp=1;
System.out.print(sum+"\t");
while(sum!=1) {
temp++;
if(sum%2==0) {
sum=sum/2;
System.out.print(sum+"\t");
}
else {
sum=sum*3+1;
System.out.print(sum+"\t");
}
}
System.out.println("\n一共经过了"+temp+"次得到1");
}
}
四、调试、测试及运行结果
1.卖鸭子递归算法与非递归算法(结果一样)
2.角谷定理递归算法与非递归算法(结果一样)
五、总结
本次题目让我初次接触递归这个概念,并进行了简单的实际应用,题目相对简单没有什么问题。