递归程序设计(卖鸭子角谷定理)

2023-10-17 16:48

本文主要是介绍递归程序设计(卖鸭子角谷定理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.实验目的
掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计;掌握递归程序转换为非递归程序的方法。

二、实验内容
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
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.题目分析

设经过第n个村子时有num(n)只鸭子,卖去num(n)/2+1只鸭子,剩下num(n+1)只鸭子,则有num(n)=num(n)/2+1+num(n+1),即num(n)=2*(num(n+1)+1)。经过了七个村子后还剩两只鸭子,即num(8)=2。因此出发时共赶num(1)只鸭子,经过第n个村子时卖出num(n)/2+1只鸭子。
2.算法构造
function(n){
count(n)=2*(count(n+1)+1) ,1<=n<8;
count(n)=2 , n=8;
}

3. 程序实现

public class Duck {public static void main(String[] args) {int result = SellDuck(0);//出发时鸭子总数int num = 0; //经过村庄卖掉的鸭子数量System.out.println("出发时共赶"+ result+"只鸭子");for(int i=1;i<=7;i++) {int ducks = (result / 2) + 1;num += ducks;result = 510-num;if(i!=7) {System.out.println("经过第" + i + "个村庄卖了" + ducks + "只鸭子,剩余" + (510-num) + "只鸭子");}else{System.out.println("经过第" + i + "个村庄卖了" + ducks + "只鸭子,剩余" + (510-num) + "只鸭子");}}}public static int SellDuck(int amount){ //amount为经过的村庄数if(amount==7){return 2;}else{return 2*(SellDuck(amount+1)+1);}}
}

4.运行结果
在这里插入图片描述

四、第二题
1.题目分析
设num(n)表示关于自然数n的一个函数,当n=1时,num(1)=1。当n>1且n为偶数时,num(n)=num(n/2);当 n>1且n为奇数时,num(n)=num(3n+1)。得到自然数1的运算次数为每次运算次数之和。
2. 算法构造
num(n)=1 ,n=1
num(n)=num(n/2) ,n>1且n为偶数
num(n)=num(3
n+1) ,n>1且n为奇数
3.程序实现

public class JiaoGu {static int i=0;public static void main(String[] args) {System.out.println("Please input a number : ");Scanner in = new Scanner(System.in);int n = in.nextInt();int i = num(n);System.out.print("STEP = "+i);}public static int num(int n) {if (n == 1) {System.out.println(n);} else if (n % 2 == 0) {System.out.println(n);num(n / 2);i++;} else {System.out.println(n);num(n * 3 + 1);i++;}return i;}
}

4.运行结果

在这里插入图片描述

这篇关于递归程序设计(卖鸭子角谷定理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226684

相关文章

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu