赶鸭子;角谷定理;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
- 算法构造:
- 赶鸭子:
递归算法函数:duck()=2 Village=0
duck()=2*(duck(village-1)+1 0<village<8
非递归算法实现:
- 角谷定理:
递归算法函数:step()=a a=1
step()=step(a/2) a%2=0
step()=step(a*3+1) a%2!=0
非递归算法实现:
- 算法实现
- 赶鸭子:
递归实现:
package Duck;//递归实现
/*village为村庄数* sum为鸭子总数* num为每经过一个村子卖出的鸭子数* */
public class Duck递归 {/*递归函数:duck()=2 village=0* duck()=2*(duck(village-1)+1) 0<village<8*/public static int duck(int village) {if(village==0)return 2;else if(village>0)return 2*(duck(village-1)+1);return village;}public static void main(String[] args) {int i,num;int sum=duck(7);System.out.println("总共有"+sum+"只鸭子!");for(i=1;i<8;i++) {num=sum/2+1;sum=sum-num;System.out.println("经过第"+i+"个村子时卖出"+num+"只鸭子,还剩下"+sum+"只鸭子");}}}
非递归实现:
package Duck;/*非递归* i为村庄数* sums为当前村庄所有鸭子总数* num为当前村庄卖出鸭子数* sum为当前村庄卖出鸭子后所剩鸭子总数*/public class Duck非递归 {public static void main(String[] args) {int i,sums,num;int sum=2;for(i=7;i>0;i--) { sums=(sum+1)*2;num=sums-sum;System.out.println("经过第"+i+"个村子时卖出"+num+"只鸭子,还剩下"+sum+"只鸭子");sum=sums;}System.out.println("总共有"+sum+"只鸭子!");}
}
- 角谷定理:
递归实现:
package 角谷定理;/*角谷定理递归方法* step为经历次数* a为输入的自然数*/import java.util.Scanner;public class 角谷定理递归 {static int step;/*递归函数: step()=a a=1 * step()=step(a/2) a%2=0* step()=step(a*3+1) a%2!=0*/public static int Step(int a) {if(a==1) //输入的自然数为1{System.out.print(a+" ");step++; }else if(a%2==0) //输入的自然数为偶数{System.out.print(a+" ");Step(a/2); //调用递归方法step++;}else if(a%2!=0) //输入的自然数为奇数{System.out.print(a+" ");Step(a*3+1); //调用递归方法step++;}return step;}public static void main(String[] args){ Scanner sc=new Scanner(System.in);System.out.print("请输入一个自然数:");int a=sc.nextInt();sc.close();int step=Step(a);System.out.println("\n一共经过了"+step+"次");}
}
非递归实现:
package 角谷定理;import java.util.Scanner;/*角谷定理非递归方法* step为经历次数* a为输入的自然数*/public class 角谷定理非递归{static int step;public static void main(String[] args) {int i;Scanner sc=new Scanner(System.in);System.out.println("请输入一个自然数:");int a=sc.nextInt();sc.close();while(a>0){if(a==1) {step++;System.out.print(a);break;}else if(a%2==0) {step++;System.out.print(a+" ");a=a/2;}else {step++;System.out.print(a+" ");a=a*3+1;}}System.out.println("\n一共经历了"+step+"次");}}
- 调试、测试及运行结果
- 赶鸭子调试:
赶鸭子运行结果:
2. 角谷定理调试:
角谷定理运行结果:
- 经验归纳
1. 一开始在duck()递归函数中只在if语句中返回了值,在函数后没有返回形参,导致错误。
2. 在调试过程进入递归函数之中,一步步观察数值变化,对递归函数算法思路更加清楚。
3. 在duck非递归函数中将村庄数倒着输出,每一步输出后,将当前村庄鸭子总数nums作为上一个村庄卖出鸭子剩余数sum,直到第一个村庄后,直接输出sum即可,开始在循环外将sum与卖出鸭子数num相加作为鸭子总数,导致结果错误。
赶鸭子;角谷定理;java实现相关推荐
- java角谷_java实现递归设计——数鸭子和角谷定理
java实现递归设计--数鸭子和角谷定理 java实现递归设计--数鸭子和角谷定理 一 .题目分析 题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还 ...
- 递归解决卖鸭子问题和验证角谷定理
实验内容: 用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式.同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法. 1.一个人赶着鸭子去每个村庄卖,每经过一个 ...
- Java解决角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
一.题目分析 2.角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 分析:假设一个数为n,定义一个 ...
- java角谷_Java:利用递归方法实现角谷定理
问题描述: 角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 3 ...
- java角谷_JAVA 角谷定理 递归
角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 34 17 5 ...
- 用递归算法实现赶鸭子问题和角谷定理
通过递归算法实现赶鸭子问题和角谷定理 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? ...
- 角谷定理python输出变化过程_角谷定理。
角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. (1) 问题分析: 首先判断输入的自然数是不是1 ...
- 经典算法-递归-角谷定理
问题:模拟角谷定理 import java.util.*; public class jiaogu {//定义全局变量static int num=0;public static int f(int ...
- 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
角谷定理:输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 34 17 5 ...
最新文章
- zencart分类页产品页去掉url中的id号
- 8 月--菜鸟吐槽日志
- [转] yaml基础
- Windows下在xampp中配置DVWA
- python基础(part16)--生成器
- 【ArcGIS微课1000例】0008:ArcGIS中如何设置相对路径?(解决图层前红色的感叹号)
- 简单阐述下OC中UIImage三种创建方式~~~
- java获取文件中的行号_如何取的Java源代码文件中文件名和行号
- 盘一盘 Spring 核心技术之依赖注入 | 原力计划
- $(document).ready()和onload区别
- idea创建maven工程_maven创建父子工程 springboot自动配置
- mysql执行计划(explain)
- javac编译java_使用javac编译java文件
- vue 中 使用 clipboard 复制内容第一次点击两次才能成功问题修改
- 自动驾驶汽车技术介绍【硬件+软件】
- 用origin画重叠柱状图 - 三维变化
- VMware Workstation 错误:“以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件。”的解决方法
- MySQL8.0与SQL server 2016的技术区别(一)
- 用几段代码搞定Java文件流
- 米斯特web安全培训第一期课程目录
热门文章
- springBoot项目--平台控制商品订单中各商家打印机打印小票--终极版
- mysql触发器的作用及语法
- pcsx2 android,PCSX2模拟器
- getlibs_Ubuntu 64位安装PS2模拟器PCSX2简明方法
- 作家生涯人物访谈报告知乎_即使您不认为自己是作家,写作也会如何改善您的职业生涯
- 抓虾代替了浏览器书签
- 2018,华米高歌猛进的一年 1
- Linux基础知识系统学习.NO2——基础字符界面命令
- 清华大学计算机科学与技术系黄必胜,清华大学计算机科学与技术系
- NB-IoT BC95/BC35 模组常用指令(NB-IoT专栏—基础篇7)