java实现递归设计——数鸭子和角谷定理

2023-05-16

一 .题目分析
题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶了多少只鸭子?经过每个村子卖出多少只鸭子?
题目二:角谷定理。输入一个自然数,若为偶数,则把它除以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.递归函数
递归函数:f(n)= 2 n=7
f(n+1)2+2 0<n<7 (因为:f(n)-(f(n)/2+1)=f(n+1))
递归函数体:f(n+1)2+2,
递归出口:第7个村庄剩余2只鸭子
注:其中n为经过的村子数,f(n)为经过n村子所剩下的鸭子数
2.具体程序中
y=2
(y+1); //由y-(y/2+1)=x 得此公式
p=y/2+1; //p为局部变量,递归时不会相互影响,每个村子卖出的鸭子数等于刚进入村子的鸭子总数的一半加一
i=i-1; //上一个村子
题目二:角谷定理
1.递归函数
f(n,c) = 1 n=1
f(n/2,c) + f(n
3+1,c) + f(1,c) n>1
递归函数体:f(n/2,c) + f(n3+1,c) + f(1,c)
递归出口:最终计算值为1
注:其中n为要计算的自然数,c为已经进行的步骤数,函数 f(n,c)的意义是自然数n经过c步运算后得到自然数1
2.具体程序中
num=num
3+1; //n为奇数
num=num/2; //n为偶数
三.算法实现
程序源代码:
题目一:赶鸭子

public class Duck { 
	public static int counts=0;		//设置全局变量counts 表示总共的鸭子数 
	public static void main(String[] args) { 		
		Duck duck = new Duck();	//实例化duck对象 
		long start = System.currentTimeMillis(); 
		counts = duck.sellDuck(7, 2);	//递归方法计算 调用sellDuck方法,计算每个村子卖出的鸭子数与总鸭子数,将总鸭子数counts返回 7为村子数,2为最后剩余鸭子数	
		//counts= duck.sellDuck1(); 	//调用非递归方法计算 	
		System.out.println("共有" +counts+ "只鸭子");		//打印总鸭子数 
		long end = System.currentTimeMillis(); 		 
		System.out.println("运行时间为:"+(end-start)+"ms"); 
		Test(counts);		//调用测试方法,如果最后剩余2与题目相符则打印测试正常,否则打印失败 	
	} 
	//递归形式
	public int sellDuck(int i,int y) { 	
		if(i>0) {
			//村子数必须为正数 	
			int x;	//剩余数
			y=2*(y+1);	//由y-(y/2+1)=x得此公式 		
			int p=y/2+1;	//p为局部变量,递归时不会相互影响,每个村子卖出的鸭子数等于刚进入村子的鸭子总数的一半加一 		
			i=i-1;	//上一个村子 	
			x=y-p;	//剩余鸭子数等于共有的减去卖出的
			sellDuck(i,y);	//递归调用sellDuck函数直到村庄数到达1 		
			System.out.println("第"+(i+1)+"个村庄,共有"+y+"只鸭子,卖出"+p+"只鸭子,剩余"+x+"只鸭子");	//打印每个村庄卖出的鸭子数 		
		} 		
		if(i==0){ 		
			counts=y;	//当经过第一个村子之前, y为鸭子总数,将y复制给counts并返回counts 	
		}
		return counts; 	
	}
	//非递归形式
	public int sellDuck1() { 
		int x=2;	//最后剩余的鸭子数 
		int p=0;	//卖出的鸭子数 	
		int y=0;	//到达每个村子的鸭子数,也是经过上一个村子的剩余鸭子数 	 
		for(int i=0;i<7;i++) {
			//采用循环 	
			y=2*(x+1);	//由y-(y/2+1)=剩余数 得此公式 	
			p=y/2+1;	//每个村子卖出的鸭子数 等于刚进入村子的鸭子总数的一半加一 	
			x=y;	//更新剩余的鸭子数 	
			System.out.println("第"+(7-i)+"个村庄,共有"+y+"只鸭子,卖出"+p+"只鸭子,剩余"+x+"只鸭子"); 	 	
		} 		
		return y;	//当经过第一个村子之前, y为鸭子总数,返回鸭子总数 	 
	}
	//测试类
	public static void Test(int counts){	//传入counts鸭子总数 		
		//经过循环,计算经过七个村子发出的鸭子数 
		for (int i=0;i<7;i++) {	
			counts=counts/2-1; 		
		}
		//如果最后剩余2 则结果正确 
		if(counts==2){		
			System.out.println("测试结束,程序正确,最后剩余鸭子数为"+counts); 		
		}
		else{ 	
			System.out.println("测试结果失败"); 	
		} 
	}
}

题目二:角谷定理

package 角谷定理;
import java.util.Scanner;
public class Jiaogu {
	public static int count=0;		//设置全局变量count表示运行次数
	public static void main(String[] args) {
		@SuppressWarnings("resource")
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入一个自然数:");
		int num =sc.nextInt();
		long start=System.currentTimeMillis(); 
		System.out.println("运算过程如下:");
		//获取运算总次数
		count=calculate(num, 1);	 //递归方法计算,调用calculate方法
		//count=calculate2(num);	 //非递归方法计算,调用calculate2方法
		System.out.println("运算总次数为:"+count);
		long end=System.currentTimeMillis(); 		
		System.out.println("运行时间为:"+(end-start)+"ms");
		Test(num,count);	//调用测试方法
	}
	//递归形式
	public static int calculate(int num, int count) {
		//当自然数为1时退出递归方法
		if (num==1) {
			System.out.println(num+" ");
			return count;
		}
		//自然数为偶数时
		if (num%2==0) {
			System.out.println(num+" ");
			num=num/2;
			count++;	//运算次数加1
			return calculate(num,count);
		} 
		//自然数为奇数时
		else {
			System.out.println(num+" ");
			num=num*3+1;
			count++;	//运算次数加1
			return calculate(num,count);
		}
	}
	//非递归形式
	@SuppressWarnings("unused")
	private static int calculate2(int num) {
		System.out.println(num+" ");
		int count=1; 		
		while (num>1) { 	
			if (num%2==0){
				num/=2; 					 
				count++; 			
				System.out.println(num+" "); 	
			} 
			else{ 	
				num=num*3+1; 	
				count++; 		
				System.out.println(num+" "); 	
			} 
		} 	
		System.out.println("经过"+count+"次可得到自然数1");
		return count; 
	}
	//测试类
	public static void Test(int num,int count){	
		int i=1;
		while (num>1){
			if (num%2==0){
				i++;
				num/=2;
			}
			else{
				i++;
				num=num*3+1;
			}
		}
		if (i==count){
			System.out.println("测试正确!");
		}
		else {
			System.out.println("测试错误!");
		}
	}
}

四.调试、测试及运行结果
题目一:赶鸭子
(一)程序调试
程序结束后计算消耗时间,并通过测试类测试程序是否正确
在这里插入图片描述
(二)总测试结果
递归方法计算:
在这里插入图片描述
非递归方法计算:
在这里插入图片描述
题目二:角谷定理
(一)程序调试
程序结束后计算消耗时间,并通过测试类测试程序是否正确
在这里插入图片描述
(二)总测试结果
递归方法计算:
在这里插入图片描述
非递归方法计算:
在这里插入图片描述
五.经验归纳
通过写程序我发现首先我得清晰的列出递归函数,找到他的递归体和递归出口。
赶鸭子问题
(1)它的递归出口是到第7个村庄剩下的鸭子数为2。递归体需要有计算,通过题目中每经过一个村子卖去所赶鸭子的一半又一只这句话即f(n)-(f(n)/2+1)=f(n+1)可知主要因素有3点,鸭子总数,卖出鸭子数,剩余鸭子数可得到公式:f(n)-(f(n)/2+1)=f(n+1),f(n)=( f(n+1)+1) 2需要明确的是经过某村庄剩下的鸭子数就是下一个村庄的总鸭子数。所以公式中的剩下只数可更新为上一步骤算出的总数。这一点非常重要。
(2)程序中还有对程序的测试代码以及时间计算代码,具体时间计算代码如下:
long start = System.currentTimeMillis();
程序体
long end = System.currentTimeMillis();
System.out.println(“运行时间为:”+(end-start)+“ms”);
角谷定理
(1)它的递归出口是最终计算值为1。递归体需要有计算,通过题目中输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1这句话可得到公式:f(n/2,c) + f(n
3+1,c) + f(1,c) ,即若n为奇数:则n= n*3+1,再将所得到的n值传入到函数f(n,c)中,从而形成递归,同理若n为偶数,则将n=n/2传入到f(n,c)中。最后函数返回c即count,代表运算次数,,
(2)程序中同样有对程序的测试代码以及时间计算代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现递归设计——数鸭子和角谷定理 的相关文章

  • grep 命令介绍

    grep 命令介绍 grep 查找文件里符合条件的字符串 xff0c 常与管道符 cat ps一起使用 xff1b 主要用于查找文件中符合条件的字符串 统计文件中符合条件的字符串行数 grep 不显示自身进程 grep 常用命令参数 c x
  • Kali Linux 安装slowhttptest步骤

    Kali Linux 安装slowhttptest步骤 Slowhttptest其实是一个DoS压力测试工具 xff0c 它集成有三种慢速攻击模式 slowloris slow http post slow read attack xff0
  • 在Centos中,程序运行是正常的,外部不能访问,内部可以访问问题解决

    在Centos中 xff0c 程序运行是正常的 xff0c 外部不能访问 xff0c 内部可以访问问题解决 今天遇到一个问题 xff0c 在centos中用python3搭建的一个web服务 xff0c 发现在centos内部可以访问网站
  • 程序设计思维与实践 Week9 作业 A 咕咕东的目录管理器

    题目描述 xff1a 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响 xff0c 时不时发生故障 xff0c 他受不了了 xff0c 想要写一个高效易用零bug的操作系统 这工程量太大了 xff0c 所以他定了一个小目标 xff0c
  • jsoncpp linux平台编译和arm移植

    0x00 下载 http sourceforge net projects jsoncpp 或者 http download csdn net detail chinaeran 8631141 0x01 Linux平台编译 安装 scons
  • 摩斯密码解码脚本

    摩斯密码解码脚本 解题思路 0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0
  • php匹配关键字并跳转页面

    php匹配关键字跳转页面 strstr函数搜索要从目标字符串中搜索的字符串 xff1b strstr函数仅用于检查字符串是否存在 xff1b strstr函数的用法如下 lt php b 61 39 or 39 name 61 GET 39
  • docker常见命令小结

    docker常见命令小结 常见命令 docker ps 查看正在运行的容器 docker exec it 264bb068855e bin bash 进入容器 xff0c 并作出修改 docker commit 3bd0eef03413 l
  • 前端html文件下载,同源与异源下载

    属性说明download下载的资源的名称target打开该连接的方式 self blank href资源的地址 本地 远程地址 a标签跳转 lt DOCTYPE html gt lt html gt lt head gt lt meta c
  • Python图像(字母数字)识别

    本文只针对数字或字母验证码识别 准备工具 tesseract ocr w64 setup v4 1 0 20190314 exepip install pytesseractpip install pillow中文包 tesseract o
  • Python习题

    1 题目 xff1a 编写一个程序 xff0c 使用for循环输出0 10之间的整数 xff1b 代码 xff1a span class token keyword for span i span class token keyword i
  • 面向对象模块和包

    文章目录 1 1 模块1 2 模块的使用2 包 1 1 模块 参考链接 xff1a Python 面向对象 模块和包 来源 xff1a CSDN Python面向对象 模块和包 来源 xff1a CSDN 概念 xff1a 每一个以py为拓
  • SUNDIALS库的编译和使用

    SUNDIALS库的编译和使用 1 简介 SUNDIALS SUite of Nonlinear and DIfferential ALgebraic equation Solvers 是由美国劳伦斯利福摩尔国立实验室 xff08 Lawr
  • 【ing】在Linux虚拟机上安装Sundials库(图文)

    1 Sundials库下载 Sundials下载地址 2 具体步骤 2 1 下载sundials 2 2 0 本次尝试选择sundials 2 2 0进行安装 Sundials文件内容如下 xff1a 2 2 创建安装目录 安装目录名称为
  • 基于docker部署Prometheus

    文章目录 基于Docker搭建Prometheusgitee 介绍Prometheus一 安装运行Prometheus docker版 部署Prometheus1 安装docker联网状态下阿里云离线安装包下载2 下载镜像包3 启动node
  • 程序设计思维与实践 Week11 作业 E 选做题11-1 东东与 ATM

    题目描述 xff1a 一家银行计划安装一台用于提取现金的机器 机器能够按要求的现金量发送适当的账单 机器使用正好N种不同的面额钞票 xff0c 例如D k xff0c k 61 1 2 N xff0c 并且对于每种面额D k xff0c 机
  • kubectl edit

    文章目录 kubectl edit官方文档语法示例 kubectl edit 官方文档 使用默认编辑器 编辑服务器上定义的资源 使用命令行工具获取的任何资源都可以使用edit命令编辑 edit命令会打开使用KUBE EDITOR xff0c
  • kubectl exec

    文章目录 kubectl exec通过bash获得pod中某个容器的TTY xff0c 相当于登录容器 命令行 创建一个test文件 xff1a kubectl exec exec命令同样类似于docker的exec命令 xff0c 为在一
  • kubectl describe

    文章目录 describe语法选项 示例描述一个node详细信息描述一个pod描述calico yaml中的资源类型和名称指定的pod描述所有的pod描述所有包含label k8s app 61 calico kube controller
  • k8s自动化安装脚本(kubeadm-1.21.1)

    文章目录 介绍软件架构安装教程更新内容2023 02 102022 10 202022 08 06准备部署包 操作步骤环境准备结构备注 解压部署包修改host文件初始化环境验证ansible配置 安装k8s集群登录master的节点添加no

随机推荐