递归解决卖鸭子问题和验证角谷定理
实验内容:
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
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.题目分析
题目一可以通过数学逻辑倒推,推导出根据现在所在村庄时候拥有的的鸭子数,推算在上一个村庄的时候拥有的鸭子数
题目二通过正常递归逻辑便可以实现
2.算法构造
2.1题目一算法构造
假设在第七个村庄拥有的鸭子数为x,根据题意可知,在第八个村庄的时候剩下2只鸭子,则x-(x/2+1)=2即 x/2-1=2,那么由在这个村子的时候拥有的鸭子数推算上一个村子的时候拥有的鸭子数公式为:前一个村子的时候的鸭子数=(目前所在村子所拥有鸭子数+1)*2;
由此编写程序
2.2题目二算法构造
目前对于角谷定理的证明还没有明确的方法。
程序源代码(请写入必要的注释)。
3.1题目一
递归实现
// A code block
var foo = 'bar';
public class Ex1 { private static int i=7;//定义一个静态成员变量用来计数public static int fun(int a){int b=(a+1)*2;//计算经过上一个村庄拥有的鸭子数量i--;//计数器-1System.out.println("经过村庄"+(i+1)+"卖出"+(b/2+1)+"只鸭子");if(i==0) {//七次之后,递归结束System.out.println("出发时共赶"+b+"只鸭子");return b;}return fun(b);//没够七个村子,递归调用}
public static void main(String []args) {fun(2);//调用函数
}
}
非递归
// A code block
var foo = 'bar';
public class Ex11 {
public static void main(String []args) {int i=7;//定义一个变量用来计数
int b=0;int a=2;while(i!=0) {b=(a+1)*2;//计算经过上一个村庄拥有的鸭子数量i--;//计数器-1System.out.println("经过村庄"+(i+1)+"卖出"+(b/2+1)+ "只鸭子");a=b;//b的值付给a}System.out.println("出发时共赶"+b+"只鸭子");
}
}
运行结果
3.2题目二
递归实现
// A code block
var foo = 'bar';
public class Ex2 {static int i=0; static int b=0;static int fun(int a) {i++;//每执行一次函数便自加一次if(a%2==0)//若为偶数,则把它除以2b=a/2;else//若为奇数,则把它乘以3加1b=a*3+1;System.out.print(b+" ");if(b!=1)return fun(b);//这个值不为1时递归继续执行else
//这个值为1时,输出执行次数,递归结束{System.out.println();System.out.println("STEP="+(i+1));return b;}}public static void main(String []args) {System.out.println("请输入一个自然数:");Scanner in=new Scanner(System.in);int a= in.nextInt();//输入一个自然数System.out.print(a+" ");fun(a); //调用函数}}非递归实现import java.util.Scanner;public class Ex21 {public static void
main(String []args) {System.out.println("请输入一个自然数:");Scanner in=new Scanner(System.in);int
a= in.nextInt();int
b=a;int i=0;while(b!=1)
{//这个值不为1时继续循环System.out.print(b+" ");i++;if(b%2==0) {//若为偶数,则把它除以2b=b/2; }else//若为奇数,则把它乘以3加1b=b*3+1;}System.out.println();//退出循环后输出执行次数System.out.println("STEP="+(i+1));}}
运行结果
递归解决卖鸭子问题和验证角谷定理相关推荐
- java角谷_java实现递归设计——数鸭子和角谷定理
java实现递归设计--数鸭子和角谷定理 java实现递归设计--数鸭子和角谷定理 一 .题目分析 题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还 ...
- 赶鸭子;角谷定理;java实现
题目分析 目的: 掌握递归程序设计的方法.明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计: 掌握递归程序转换为非递归程序的方法. 要求: 用递归方法设计下列各题,并 ...
- HDU1279 验证角谷猜想【水题】
验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- c语言问题 角谷猜想,hdu 1279 验证角谷猜想(简单的模拟)
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- 1279 验证角谷猜想
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- B - 验证角谷猜想
数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数,如果是奇数,则乘以三 ...
- 用递归算法实现赶鸭子问题和角谷定理
通过递归算法实现赶鸭子问题和角谷定理 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? ...
- hdu 1279 验证角谷猜想(简单的模拟)
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- matlab验证角谷猜想问题,角谷猜想1.5编程基础之循环控制21
一道基础的ACM数学编程题 纠结下,k-base这是指k进制,不是指k位的数.这个题的意思是,找出n的个数,n的意思是,能被一个多位数整除,同时该每个数相加后也能被整除.下面说下为什么这个多位数(m位 ...
最新文章
- blazeface学习笔记
- python利器app-有了这个神器,轻松用 Python 写 APP !
- python有哪些作用-python描述符有什么作用
- CUDA编程之快速入门
- XML-RPC远程方法调用
- 压缩vmware中的ubuntu系统(虚拟机瘦身大法)
- linux 挂载有数据硬盘分区,linux下磁盘分区、挂载知多少
- Unity3D 动态加载 图片序列正反播放
- 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
- 【ES6】什么是Promise?解析Promise的基本用法
- linux 脚本自动添加防火墙规则
- Kotlin学习总结(1)——Kotlin快速入门
- php mysql_fetch_field_PHP mysqli_fetch_field() 函数
- 大数据之-Hadoop3.x_MapReduce_序列化案例FlowReducer---大数据之hadoop3.x工作笔记0099
- 大场面试必问:秒杀90%Java面试者,后悔没有早点知道!
- MySQL使用内置函数来进行模糊搜索locate()与like的不同
- 驰为vi10旗舰版linux,驰为Vi10平板电脑完全安装Win10步骤 BY Chinasred
- 美创科技荣获国家信息安全漏洞库(CNNVD)技术支撑单位
- 常用电子元器件基础知识总结
- 解决 | 点击任务栏没有反应
热门文章
- 股票量化对冲策略的发展与展望
- android 7.0 连接电脑,Android 7.0:有人欢喜有人愁
- 《常识:有用的无用的百科知识》新书相赠!
- 人见人爱A^B之解题思路
- 2014-04网易、微软、百度、腾讯、阿里实习生招聘经验与经过
- Linux系统中删除虚拟机,要删除利用虚拟机安装的linux操作系统,下面哪种方法不能实现删除虚拟系统?...
- 智能家居和建筑行业调研报告 - 市场现状分析与发展前景预测
- 学Python划重点 四 (图形界面wxPython 库的使用)
- 《深入剖析Kubernetes》-张磊——白话容器基础(三):深入理解容器镜像
- VLN阅读报告1:Vision-and-Language Navigation综述(2022ACL)