作者:无*
时间: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语句方便进行比较。通过本次上机,我总结了以下的方法:在递归程序的设计过程中,首先要进行正确的题目分析(如:用数学方法推导出递归公式等),可以先将自己的算法设计用普通方法编写出来。其次进一步就是设计大致的结构:递归的出口还有递归体分别是什么,最后再进行整合。

递归程序设计之赶鸭子相关推荐

  1. 吉林大学超星慕课《高级程序语言设计》实验06 递归程序设计(2020级)

    代码仅供参考,欢迎一起交流! 1 题目名称:排列组合 2 题目名称:Hermite多项式 3 题目名称:Ackerman函数 4 题目名称:最大公因数 5 题目名称:顺序检索 6 题目名称:最大元素 ...

  2. 吉林大学 超星慕课 高级语言程序设计 实验07 递归程序设计(2022级)

    本人能力有限,发出只为帮助有需要的人. 建议同学们自己写完后再进行讨论. 1.题目名称:排列组合 问题描述:编写程序求函数C(m,n)的值. 输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和 ...

  3. python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  4. java角谷_java实现递归设计——数鸭子和角谷定理

    java实现递归设计--数鸭子和角谷定理 java实现递归设计--数鸭子和角谷定理 一 .题目分析 题目一:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还 ...

  5. python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  6. 赶鸭子;角谷定理;java实现

    题目分析 目的: 掌握递归程序设计的方法.明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计: 掌握递归程序转换为非递归程序的方法. 要求: 用递归方法设计下列各题,并 ...

  7. C语言经典例27-利用递归逆序输出字符串

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. 2 分析 从递归程序设计三大要素角度来分析: 该递归程序的目的:逆序输出字符 ...

  8. 第三章:3.栈和队列 -- 栈与递归的实现

    前言: 栈还有一个总要应用是在程序设计语言中实现递归.一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数. 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离 ...

  9. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

最新文章

  1. Linux 下实现虚拟光驱功能,查看iso文件内容
  2. 4岁的儿子还不会写红黑树,我该怎么办?
  3. mysql忘记密码,如何重置密码
  4. inputStream输入流转为String对象(将String对象转为inputStream输入流)
  5. propertychange input change
  6. Git SSH Key 生成步骤
  7. 投资学习网课笔记(part7)--基金第七课
  8. 研究生计划-心得征程
  9. python json串中文乱码问题
  10. android 控件发光_如何在android中的按钮周围制作动画/常量发光效果?
  11. C++智能指针shared_ptr使用实例
  12. 2台电脑共享一套键鼠方法
  13. 转博答辩ppt_如何高质量的完成一个论文答辩ppt?
  14. 利用matlab命令窗口绘制simulink仿真示波器波形的方法,利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法...
  15. 计算机应用软件弹窗消除,怎么去掉电脑弹窗广告?这几种方法教你轻松解决
  16. 博客已死?移动互联网时代博客的价值
  17. git删除分支时究竟会删掉哪些东西
  18. PNG或JPEG或PDF转eps
  19. Keyboard Demo
  20. 计算机考试考前培训怎么弄,关于2016年下半年全国计算机等级考试考前培训实施方案...

热门文章

  1. 传统PC和云桌面的五大差异
  2. linux 卸载kde桌面,Ubuntu下完全卸载KDE的方法
  3. 我的网站需要什么SSL证书?
  4. 2017年11月23日学习笔记_用python解决杨辉三角函数,以及理解
  5. mysql安全性_如何提高mysql的安全性
  6. 毕设 房价预测分析与可视
  7. Kali 安装USB无线网卡驱动
  8. 孝经白话:孝治章第八
  9. 论文研究 | 基于图像处理技术的零件孔位尺寸快速测量方法
  10. redhat 7.6 配置yum源