递归

一、 题目内容
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
二、 题目分析

  1. 题目1
    递归方法:
    定义返回值为整数型的方法为作为递归方法,第一个参数i为此时的鸭子数,第二个参数count为此时递归的次数。递归出口为count次数达到7,说明此时经过7个村庄,所以此时应跳出循环,返回递归次数。否则将第一个参数用(i+1)*2作为第一个参数继续返回该方法。
    非递归方法:
    用while循环,用count作为计算经过的村庄数量,同时计算循环次数。当判断条件count<7时,进入循环。在循环体中,令鸭子数i的值变为(i+1)*2。同时count+1.
  2. 题目2
    递归方法:
    定义递归方法,返回值为整数型,第一个参数i作为最初的自然数,第二个参数count作为计数变量,计算递归的次数。每次进入该方法时,count++。当i=1时,作为递归出口,返回计数结果。否则判断i的值,若为奇数,返回该方法,将第一个参数变为i3+1.若为偶数,返回该方法,将第一个参数变为i/2。
    非递归方法:
    用while循环。判断条件为i不等于1,循环体中判断i的值为奇数还是偶数。若为奇数,将i的值变为i
    3+1,若为偶数,将i的值变为i/2。每次循环后count变量+1.
    三、 算法实现
    题目1(递归)
	public static int fun(int i,int count){
		//递归出口 计数器count==7,得到最初的鸭子数,此时输出鸭子数
		if(count==7){
			sum=i;
			System.out.println("出发时有"+sum+"只鸭子");
			return i;
			
		}
		
		else {
			count++;			
			if(count<8)
				//当计数器<8时,未经历7个村庄 所以继续进入递归 并输出此时村庄号数 和 鸭子数
			System.out.println("第"+(8-count)+"个村庄卖出"+((i+1)*2-i)+"只鸭子");
			//返回自身 并将鸭子数用(i+1)*2表达式 计算出上一个村庄时的鸭子
			return fun((i+1)*2,count);
			
		}
	}
题目1(非递归)
//从 count=0时开始循环, 每次循环令i=(i+1)*2;得到上一个村庄时的鸭子数,用((i+1)*2-i)表达式计算出这个村庄买了多少鸭子
		while(count<7){
			count++;
			
			System.out.println("第"+(8-count)+"个村庄卖出"+((i+1)*2-i)+"只鸭子");
			i=(i+1)*2;
		}
		System.out.println("出发时有"+i+"只鸭子");

题目2(递归)

public static int f(int i,int count){
		count ++; //每次调用递归方法时,计数器+1		
		//当i为1时,作为递归的出口。此时不再调用自身,并且输出最后一个数 和计数器的值
		if(i==1){		
			System.out.println(i+" ");
			System.out.println(count);
			return count;
		}
		//当i为奇数且i不等于1时,输出这个数,并进入递归,将第一个参数变为i*3+1
		else if((i%2)!=0&&i!=1){
			System.out.print(i+" ");			
			return f(i*3+1,count);					
		}		
		//当i为偶数时,输出这个数,再次调用自身,将第一个参数变为i/2
		else if(i%2==0){		
			System.out.print(i+" ");
			
			return f(i/2,count);
		}
		else {
			return 0;
		}
	}

题目2(非递归)

//若n不等于1,则一直循环
		while(n!=1){
			//如果n为奇数,将n的值变为n*3+1,同时count+1.输出这个数
			if((n%2)!=0){
				count++;
				System.out.print(n+" ");
				n=n*3+1;				
			}
			//如果n为偶数,将n的值变为n/2,同时count+1.输出这个数
			else if((n%2)==0){
				count++;
				System.out.print(n+" ");
				n=n/2;				
			}
		}

运行截图
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值