• 题目分析

目的:

  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. 赶鸭子:

递归算法函数:duck()=2                                 Village=0

duck()=2*(duck(village-1)+1   0<village<8

非递归算法实现:

  1. 角谷定理:

递归算法函数:step()=a            a=1

step()=step(a/2)     a%2=0

step()=step(a*3+1)   a%2!=0

非递归算法实现:

  • 算法实现
  1. 赶鸭子:

递归实现:

package Duck;//递归实现
/*village为村庄数* sum为鸭子总数* num为每经过一个村子卖出的鸭子数* */
public class Duck递归 {/*递归函数:duck()=2                        village=0*          duck()=2*(duck(village-1)+1)    0<village<8*/public static int duck(int village) {if(village==0)return 2;else if(village>0)return 2*(duck(village-1)+1);return village;}public static void main(String[] args) {int i,num;int sum=duck(7);System.out.println("总共有"+sum+"只鸭子!");for(i=1;i<8;i++) {num=sum/2+1;sum=sum-num;System.out.println("经过第"+i+"个村子时卖出"+num+"只鸭子,还剩下"+sum+"只鸭子");}}}

非递归实现:

package Duck;/*非递归* i为村庄数* sums为当前村庄所有鸭子总数* num为当前村庄卖出鸭子数* sum为当前村庄卖出鸭子后所剩鸭子总数*/public class Duck非递归 {public static void main(String[] args) {int i,sums,num;int sum=2;for(i=7;i>0;i--) {                       sums=(sum+1)*2;num=sums-sum;System.out.println("经过第"+i+"个村子时卖出"+num+"只鸭子,还剩下"+sum+"只鸭子");sum=sums;}System.out.println("总共有"+sum+"只鸭子!");}
}
  1. 角谷定理:

递归实现:

package 角谷定理;/*角谷定理递归方法*  step为经历次数* a为输入的自然数*/import java.util.Scanner;public class 角谷定理递归 {static int step;/*递归函数:  step()=a        a=1 *           step()=step(a/2)    a%2=0*           step()=step(a*3+1)   a%2!=0*/public static int Step(int a) {if(a==1)    //输入的自然数为1{System.out.print(a+" ");step++;  }else if(a%2==0)   //输入的自然数为偶数{System.out.print(a+" ");Step(a/2);    //调用递归方法step++;}else if(a%2!=0)   //输入的自然数为奇数{System.out.print(a+" ");Step(a*3+1);     //调用递归方法step++;}return step;}public static void main(String[] args){       Scanner sc=new Scanner(System.in);System.out.print("请输入一个自然数:");int a=sc.nextInt();sc.close();int step=Step(a);System.out.println("\n一共经过了"+step+"次");}
}

非递归实现:

package 角谷定理;import java.util.Scanner;/*角谷定理非递归方法* step为经历次数* a为输入的自然数*/public class 角谷定理非递归{static int step;public static void main(String[] args) {int i;Scanner sc=new Scanner(System.in);System.out.println("请输入一个自然数:");int a=sc.nextInt();sc.close();while(a>0){if(a==1) {step++;System.out.print(a);break;}else if(a%2==0) {step++;System.out.print(a+" ");a=a/2;}else {step++;System.out.print(a+" ");a=a*3+1;}}System.out.println("\n一共经历了"+step+"次");}}
  • 调试、测试及运行结果
  1. 赶鸭子调试:

赶鸭子运行结果:

2. 角谷定理调试:

角谷定理运行结果:

  • 经验归纳

1.  一开始在duck()递归函数中只在if语句中返回了值,在函数后没有返回形参,导致错误。

2. 在调试过程进入递归函数之中,一步步观察数值变化,对递归函数算法思路更加清楚。

3. 在duck非递归函数中将村庄数倒着输出,每一步输出后,将当前村庄鸭子总数nums作为上一个村庄卖出鸭子剩余数sum,直到第一个村庄后,直接输出sum即可,开始在循环外将sum与卖出鸭子数num相加作为鸭子总数,导致结果错误。

赶鸭子;角谷定理;java实现相关推荐

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

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

  2. 递归解决卖鸭子问题和验证角谷定理

    实验内容: 用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式.同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法. 1.一个人赶着鸭子去每个村庄卖,每经过一个 ...

  3. Java解决角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。

    一.题目分析 2.角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 分析:假设一个数为n,定义一个 ...

  4. java角谷_Java:利用递归方法实现角谷定理

    问题描述: 角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 3 ...

  5. java角谷_JAVA 角谷定理 递归

    角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 34 17 5 ...

  6. 用递归算法实现赶鸭子问题和角谷定理

    通过递归算法实现赶鸭子问题和角谷定理 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只.这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? ...

  7. 角谷定理python输出变化过程_角谷定理。

    角谷定理.输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. (1) 问题分析: 首先判断输入的自然数是不是1 ...

  8. 经典算法-递归-角谷定理

    问题:模拟角谷定理 import java.util.*; public class jiaogu {//定义全局变量static int num=0;public static int f(int ...

  9. 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。

    角谷定理:输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限次运算后,总可以得到自然数值1.求经过多少次可得到自然数1. 如:输入22, 输出 22 11 34 17 5 ...

最新文章

  1. zencart分类页产品页去掉url中的id号
  2. 8 月--菜鸟吐槽日志
  3. [转] yaml基础
  4. Windows下在xampp中配置DVWA
  5. python基础(part16)--生成器
  6. 【ArcGIS微课1000例】0008:ArcGIS中如何设置相对路径?(解决图层前红色的感叹号)
  7. 简单阐述下OC中UIImage三种创建方式~~~
  8. java获取文件中的行号_如何取的Java源代码文件中文件名和行号
  9. 盘一盘 Spring 核心技术之依赖注入 | 原力计划
  10. $(document).ready()和onload区别
  11. idea创建maven工程_maven创建父子工程 springboot自动配置
  12. mysql执行计划(explain)
  13. javac编译java_使用javac编译java文件
  14. vue 中 使用 clipboard 复制内容第一次点击两次才能成功问题修改
  15. 自动驾驶汽车技术介绍【硬件+软件】
  16. 用origin画重叠柱状图 - 三维变化
  17. VMware Workstation 错误:“以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件。”的解决方法
  18. MySQL8.0与SQL server 2016的技术区别(一)
  19. 用几段代码搞定Java文件流
  20. 米斯特web安全培训第一期课程目录

热门文章

  1. springBoot项目--平台控制商品订单中各商家打印机打印小票--终极版
  2. mysql触发器的作用及语法
  3. pcsx2 android,PCSX2模拟器
  4. getlibs_Ubuntu 64位安装PS2模拟器PCSX2简明方法
  5. 作家生涯人物访谈报告知乎_即使您不认为自己是作家,写作也会如何改善您的职业生涯
  6. 抓虾代替了浏览器书签
  7. 2018,华米高歌猛进的一年 1
  8. Linux基础知识系统学习.NO2——基础字符界面命令
  9. 清华大学计算机科学与技术系黄必胜,清华大学计算机科学与技术系
  10. NB-IoT BC95/BC35 模组常用指令(NB-IoT专栏—基础篇7)