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

一.实验目的

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

二、实验内容

用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。

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.运行结果

55a34feb748739ae11e277c00019f9cb.png

四、第二题

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(3n+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.运行结果

df6366a13e0517d2598b93aa4a9b5d91.png

标签:角谷,递归,int,System,num,鸭子,out

来源: https://blog.csdn.net/rrrrghi/article/details/90727294

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值