递归程序设计
实验内容: 用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
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.题目分析
假设出发时共赶了x只鸭子,经过第一个村子卖出(x/2+1)只鸭子,经过第二个村子卖出(x/2+1)/2+1,鸭子数量每经过一个村子会减少一半加一只。每次交易之前鸭子的总数为交易之后的数目加一乘以二。
2.算法构造
3.算法实现:
public class Demo1 {
public static int result(int num,int sum) {
//经过第num个村子,交易后剩sum只鸭子
num--;
if(num==0) {
System.out.println("未交易前总共有"+(sum+1)*2+"只鸭子");
return 1;//递归出口
}
else {
sum=(sum+1)*2;
System.out.println("经过第"+num+"个村子后,还剩"+sum+"只鸭子");
return result(num,sum);//递归体
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("经过第7个村子后,还剩2只鸭子");//已知条件
result(7,2);
}
}
4.调试、测试及运行结果
(1)调试:
(2)运行结果
第二题
1.题目分析
输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
2.算法构造
(1)
3.算法实现:
public class Demo2 {
public static int step=1;
public static int count(int x) {
if(x==1) {
System.out.print("\nSTEP="+step);
return step;//递归出口
}
else if(x%2==0) {
x=x/2;
System.out.print(" "+x);
}else {
x=x*3+1;
System.out.print(" "+x);
}
step++;
return count(x);//递归体
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("请输入一个自然数:");
int x = in.nextInt();
System.out.print(x);
count(x);
}
}
4.调试、测试及运行结果
(1)调试
(2)测试
(3)运行结果
5.经验归纳
递归算法,其实说白了,就是程序的自身调用,在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。