java实现赶鸭子、角谷定理(递归算法以及非递归算法)

一、题目分析
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.角谷定理递归算法与非递归算法(结果一样)
在这里插入图片描述

五、总结
本次题目让我初次接触递归这个概念,并进行了简单的实际应用,题目相对简单没有什么问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值