递归程序设计

 

  • 递归程序设计

一.实验目的

  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. 首先第一个题目由于最终只剩两只鸭子,且题目告诉我们每经过一个村子卖去所赶鸭子的一半又一只。所以我们可以用逆向思维得到开始的,每次递归表示经过一个村庄,在递归体里面写相应的计算语句,当达到所有村庄数量后退出递归,这就是递归头。第二个题目用相应变量的值等于1时跳出递归,在递归体里用选择结构进行偶数或者奇数情况时的相应计算。

二.算法构造

1.定义一个递归函数fun,fun函数中定义两个变量num(经过一次村庄后所剩的鸭子数),village(经过的村庄数)。

2.当经过第七过村庄时,剩两个鸭子。可以推出经过第六次村庄所剩的的鸭子数num=(2+1)*2;然后将第六次的鸭子数作为第五次经过村庄所剩的鸭子数,依次推出第零次,village==0时的num,将num返回;

三.算法实现:

package 赶鸭子;

public class Main {
	public static void main(String[] args) {
		int a ;
		a=fun(2,7);
		System.out.println("一共有"+a+"只鸭子");
	}

public static int fun(int num,int village) {;
	   int sell;
     if(village==0) {
		return num;
	}else  {
		
		 sell=num/2+1;
         System.out.println("第"+(village)+"个村子"+"卖了"+sell+"只鸭"); 
	
	return fun((num+1)*2,village-1);
   }
}
}

第二题:

一.题目分析

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

二.算法构造

A.定义一个递归函数fun表示步数

B.传进一个参数num,判断为奇数还是偶数,若是奇数,则将num*3+1,若为偶数则num/2。

C.当num=1时,返回0步,当num>0时,返回fun(num)+1

三.源代码

package 角谷定理;

public class Main {
 
public static void main(String[] args) {
	
	System.out.println("\n"+"需要的步数为:"+fun(22));
}

public static int fun(int num) {
	if(num==1) {
		return 0;
	}
	if(num!=1) {
		if(num%2==0) {
			num=num/2;
		}
		else {
			num=num*3+1;
		}
	}
	
	System.out.print(num+",");
	return fun(num)+1;
	
}
}

四.调试测试及运行结果:

运行结果:

 

 

五.经验归纳:

1.首先要明确自己定义的递归函数表示什么。

2.明确递归结束的条件。

3,若输出的是函数本身,数据一定是先进后出。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值