递归程序设计之赶鸭子
作者:无*
时间:2019-5-27
递归程序设计
一.题目分析
题目一:
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
递归算法:递归出口(num==0,num表示的是村庄数);递归表达式(duck(2*(sum+1),num-1)sum表示剩余鸭子数);先调用duck(2,7);可以求出鸭子总数,再在函数体内实现递归调用,最后求出每经过一个村庄所卖鸭子数。
非递归算法:调用此函数,函数体最后返回鸭子总数,函数体内通过一个for循环表示每经过一个村庄所卖鸭子数,主要变量有:最后剩余的鸭子数,所赶的鸭子数及所卖的鸭子数。
**主要算法规律总结:
所卖鸭子数=所赶鸭子数/2+1;
所赶鸭子数-(所赶鸭子数/2+1)=2 --------第7个村子
题目二:
角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
递归算法:首先利用if语句判断奇数偶数,再通过判断数字是否为1,如果不为1,进行递归调用,继续判断,直至结果为一。其中还要设置一个STEP变量记录次数。
非递归算法:
通过while循环实现非递归算法,最后输出每一步的结果,并且输出执行次数STEP;
**主要算法
奇数和偶数的判断以及要执行的语句
判断偶数(num%2==0);
二.算法构造
题目一:
递归算法:
递归出口(num==0), 递归函数体:所赶鸭子数=2*(sum+1),此时村庄数num-1
如果满足递归出口条件则直接返回sum;否则进行递归调用。注意先利用一个函数调用计算出总的鸭子数,再利用一个for循环计算出所卖出的鸭子,本天所卖出的鸭子数=本天所赶鸭子数x/2+1;下一天的所赶鸭子数x=本天所赶鸭子数x/2-1;
非递归算法:
定义三个变量最后剩余的鸭子数remanent=2,所赶的鸭子数y=0及所卖的鸭子数sellnum=0;通过一个for循环计算出每一步的结果,for循环中的主要执行语句为:
所赶鸭子数y=2*(剩余鸭子数remanent+1);所卖鸭子数sellnum=所赶鸭子数y/2+1;
最后每一次还要更新剩余鸭子数remanent=y;(即上一天所剩余的鸭子数=这一天所赶的鸭子数);最后返回鸭子总数y.
题目二:
递归算法:
递归出口(num==1)
num=num/2(偶数) num=3*num+1(奇数);
如果不满足递归出口则实现递归调用jiaogu(num,STEP);
非递归算法:
利用while语句实现循环,多次调用。while语句的条件时(num!=1)输出每一步的结果,函数最后的返回值为STEP;
三.算法实现
(详细完整代码另附)
主要代码部分:
题目一:
递归部分:
public static int duck(int sum,int num) //sum表示鸭子数,num表示村庄数{ if(num==0){ //递归出口return sum;}else{return duck(2*(sum+1),num-1);}}
非递归部分:
public static int duck2() { int remanent=2;//最后剩余的鸭子数int sellnum=0;//卖出的鸭子数int y=0;//所赶的鸭子数 for(int j=1;j<8;j++){ y=2*(remanent+1);sellnum=y/2+1;remanent=y;System.out.println("经过第"+(8-j)+"个村庄"+"卖出的鸭子数为"+sellnum);} return y;}
题目二:
递归算法:
public static void jiaogu(int num,int STEP) { if(num%2==0) //num为偶数{ num=num/2;System.out.println(num);}else if(num%2!=0&&num!=1) //num为奇数{num=3*num+1;System.out.println(num);}STEP++; //STEP表示次数if(num!=1)jiaogu(num,STEP);if(num==1){System.out.println("STEP="+STEP);}}
非递归算法:
public static int jiaogu2(int num,int STEP) { while(num!=1){if(num%2==0) //num为偶数{ num=num/2;}else{num=3*num+1; }System.out.println(num);STEP++;}return STEP;}
四.调试,测试及运行结果
1.调试:
题目一:
题目2::
2.测试
题目一测试代码及截图:
public static void test1(int ducknum){for(int i=1;i<8;i++)ducknum=ducknum/2-1;if(ducknum==2)System.out.println("代码正确,测试成功");elseSystem.out.println("测试有误");}
题目二:
3.运行结果
分别利用switch语句写了每个题目的递归算法和非递归算法
题目一:
递归算法:
非递归算法:
题目二:
递归算法:
非递归算法:
五.经验归纳
通过本次的上机题目,掌握了递归程序设计的方法,明确了递归的概念,通过对不同题目的分析,找出了递归的出口和对应的递归体。同时针对一个问题,还能有不同的思考方式,能将递归与非递归进行相应的转化。了解到了递归模型由递归出口和递归体两部分组成,前者确定递归何时结束,后者确定递归的方式。递归的应用在有些情况下能让程序更简洁易懂,改善程序的可读性。
在本次上机实验中,针对两个题目分别应用了递归算法和非递归算法,最后用了switch语句方便进行比较。通过本次上机,我总结了以下的方法:在递归程序的设计过程中,首先要进行正确的题目分析(如:用数学方法推导出递归公式等),可以先将自己的算法设计用普通方法编写出来。其次进一步就是设计大致的结构:递归的出口还有递归体分别是什么,最后再进行整合。
递归程序设计之赶鸭子相关推荐
- 吉林大学超星慕课《高级程序语言设计》实验06 递归程序设计(2020级)
代码仅供参考,欢迎一起交流! 1 题目名称:排列组合 2 题目名称:Hermite多项式 3 题目名称:Ackerman函数 4 题目名称:最大公因数 5 题目名称:顺序检索 6 题目名称:最大元素 ...
- 吉林大学 超星慕课 高级语言程序设计 实验07 递归程序设计(2022级)
本人能力有限,发出只为帮助有需要的人. 建议同学们自己写完后再进行讨论. 1.题目名称:排列组合 问题描述:编写程序求函数C(m,n)的值. 输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和 ...
- python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...
- java角谷_java实现递归设计——数鸭子和角谷定理
java实现递归设计--数鸭子和角谷定理 java实现递归设计--数鸭子和角谷定理 一 .题目分析 题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还 ...
- python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...
- 赶鸭子;角谷定理;java实现
题目分析 目的: 掌握递归程序设计的方法.明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计: 掌握递归程序转换为非递归程序的方法. 要求: 用递归方法设计下列各题,并 ...
- C语言经典例27-利用递归逆序输出字符串
目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. 2 分析 从递归程序设计三大要素角度来分析: 该递归程序的目的:逆序输出字符 ...
- 第三章:3.栈和队列 -- 栈与递归的实现
前言: 栈还有一个总要应用是在程序设计语言中实现递归.一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数. 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离 ...
- Python多态、鸭子类型
一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...
最新文章
- Linux 下实现虚拟光驱功能,查看iso文件内容
- 4岁的儿子还不会写红黑树,我该怎么办?
- mysql忘记密码,如何重置密码
- inputStream输入流转为String对象(将String对象转为inputStream输入流)
- propertychange input change
- Git SSH Key 生成步骤
- 投资学习网课笔记(part7)--基金第七课
- 研究生计划-心得征程
- python json串中文乱码问题
- android 控件发光_如何在android中的按钮周围制作动画/常量发光效果?
- C++智能指针shared_ptr使用实例
- 2台电脑共享一套键鼠方法
- 转博答辩ppt_如何高质量的完成一个论文答辩ppt?
- 利用matlab命令窗口绘制simulink仿真示波器波形的方法,利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法...
- 计算机应用软件弹窗消除,怎么去掉电脑弹窗广告?这几种方法教你轻松解决
- 博客已死?移动互联网时代博客的价值
- git删除分支时究竟会删掉哪些东西
- PNG或JPEG或PDF转eps
- Keyboard Demo
- 计算机考试考前培训怎么弄,关于2016年下半年全国计算机等级考试考前培训实施方案...