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.题目分析
假设出发时共赶了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.经验归纳
递归算法,其实说白了,就是程序的自身调用,在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。

猜你喜欢

转载自blog.csdn.net/qq_45915957/article/details/106666204