java角谷_java实现递归设计——数鸭子和角谷定理
java实现递归设计——数鸭子和角谷定理
java实现递归设计——数鸭子和角谷定理
一 .题目分析
题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶了多少只鸭子?经过每个村子卖出多少只鸭子?
题目二:角谷定理。输入一个自然数,若为偶数,则把它除以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
递归函数体: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(n3+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=num3+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(n3+1,c) + f(1,c) ,即若n为奇数:则n= n*3+1,再将所得到的n值传入到函数f(n,c)中,从而形成递归,同理若n为偶数,则将n=n/2传入到f(n,c)中。最后函数返回c即count,代表运算次数,,
(2)程序中同样有对程序的测试代码以及时间计算代码
java实现递归设计——数鸭子和角谷定理相关教程
java角谷_java实现递归设计——数鸭子和角谷定理相关推荐
- java 半角数字_Java中字符的半角和全角
前几天在工作中遇到一个问题 在一个程序中进行Excel的导入,将Excel中的一系列城市编码在程序中解析,转换为int型,因为Excel中的部分城市编码带有空格,因此需要在代码中将其转换为String ...
- java质因数算法_Java分解任意输入数的质因数算法的实现示例
这篇文章主要介绍了Java实现分解任意输入数的质因数算法,涉及java数学运算相关操作技巧,需要的朋友可以参考下 本文实例讲述了Java实现分解任意输入数的质因数算法.分享给大家供大家参考,具体如下: ...
- 猜数字java程序设计分析_JAVA程序设计课程设计-猜数字游戏设计
JAVA程序设计课程设计-猜数字游戏设计 课 程 设 计 报 告课程设计名称 Java 程序设计 专 业 计算机科学与技术 班 级 2 班 学 号 08030212 姓 名 指导教师 成 绩 2011 ...
- java十进制输出_JAVA输入一个十进制数N,输出r进制的数
\\引入包 import java.util.Scanner; import java.util.Stack; public class Change { public static void mai ...
- java 开发者异常处理_Java异常处理和设计
本篇博客内容转自http://www.cnblogs.com/dolphin0520/p/3769804.html,内容供自己学习参考之用 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序 ...
- java创建画板_java画板的设计和创建
首先创建一个画板类继承容器类,这样可以在画板类中重写容器的paint方法. public class DrawFrame extends JPanel 再创建一个类写监听器的程序,以及一个类来写画板的 ...
- java 简单 框架_java简单框架设计
设计框架包可以作为一个工具给大家用,需要有完全不同设计思路给出来,不同于我们去做一个web服务.网站. 或者一个业务微服务,需要从原来使用视角转换成一个构建者视角. 框架或者工具,更多是框架来管理或者 ...
- java统计在线人数_java统计当前在线数 (转)
java统计当前在线数 (转)[@more@] package com.hnedu.stat; /** * 计算在线人数,说明: * * 在访问页面放入: * com.hnedu.stat.Onlin ...
- java论文致谢_JAVA语言课程设计论文致谢
JAVA语言课程设计论文致谢 JAVA语言课程设计的选题.探讨及报告的撰写均是在我们的指导教师的悉心指导下进行的.设计中的每一个环节无不凝聚着老师的心血.老师在课程设计方面有很多的实践经验,在我们面对 ...
最新文章
- codeforces E. Games on a CD(双hash)
- python 白化_MeteoInfo和Python显著性检验
- hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix
- js 数字,金额 用逗号 隔开。数字格式化
- 剑指offer0JZ81 调整数组顺序使奇数位于偶数前面(二)(C++,附思路)
- total video converter 绿色_志愿服务清理杂草 牵手绿色生态文明
- 001redis数据库的介绍
- python_cookie
- 【Linux】Ubuntu输入法不能开机自启的解决方法
- java: Internal error in the mapping processor: java.lang.NullPointerException问题解决
- LeetCode【1051. 高度检查器】
- 软件各项会议评审意见模版
- 解除极域电子教室软件控屏的方法
- 一句话告诉你为什么有些jQuery插件会有特殊字符(加号、减号、感叹号等)
- python制作脑图_使用Python将xmind脑图转成excel用例(一)
- 从零开始的VUE项目-09(vue-alipayer-v视频播放)
- 树莓派CM4和CM4IO上手
- 深度学习学习笔记——keras中的verbose
- 会议OA之会议排座送审
- nRF24L01+ 数据手册
热门文章
- mac广告拦截软件:1Blocker for Mac
- 开发app需要什么技术?手机app制作方式、价格及性能盘点
- Python Leetcode(905.按奇偶排序数组)
- can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
- 密码学系列之:NIST和SHA算法
- 渗透测试之破解密码(3)
- 图案设计灵感怎么写_设计的灵感来源
- ACC算法学习笔记(一):ACC法规
- Jquery基础学习之-入门
- 在CentOS7上运行KVM虚拟机