数鸭子问题和角谷定理

数鸭子问题和角谷定理

一、实验目的

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

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

由最后所剩的鸭子数和经过的村子数反推最初拥有的鸭子数。
递归:递归出口为经过的村子数,同时题目中“经过第7个村子后”和“经过第7个村子时”是不同的,这会影响递归出口的参数。
递归表达式:前一个村子拥有的鸭子数 = (当前所有拥有的鸭子数 + 1) * 2
将前一个村子拥有的鸭子数作为参数(当前拥有鸭子数)传回函数中进行递归

非递归:使用for循环,终止条件是统计村子数的参数等于设置的经过的参数,循环体为:
前一个村子拥有的鸭子数 = (当前所有拥有的鸭子数 + 1) * 2
2.对于题目二:
递归:递归出口为当前的自然数nubmber是否为1,若为1,则递归结束,否则继续进行递归。
递归表达式:当自然数number不为1,且为偶数时:number /=2;
当自然数number不为1, 且为奇数时:number = 3 * number + 1;
非递归:使用while,终止条件是number为1,在循环体中判断参数是偶数还是奇数,并做相应的操作。
在这里插入图片描述在这里插入图片描述
四、源代码
数鸭子:

class Ducks{
   

	public static int flag = 0;
	/*
	 * 计算鸭子的方法中
	 * 第一个参数为最后剩余的鸭子数目,第二个参数为一共经过的天数
	 */
	public int countDucks1(int number, int day) {
   
		++flag;
		if(flag == day + 1) {
   
			System.out.println
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值