- 递归程序设计
一.实验目的
- 掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计;
- 掌握递归程序转换为非递归程序的方法。
- 实验内容
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
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.定义一个递归函数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);
}
}
}
第二题:
一.题目分析
- 角谷定理。输入一个自然数,若为偶数,则把它除以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,若输出的是函数本身,数据一定是先进后出。