【面向对象程序设计(Java)】 7-3 递归方法

第1关:猴子摘桃(递归问题)
任务描述
本关任务: 猴子吃桃问题:小猴子摘了一堆桃子。第一天吃掉一半又多吃了1个,第二天吃了剩下的一半又多吃1个,以后每天都吃掉剩下的一半多一个。第10天发现只剩一个桃子了。问第一天摘了多少桃子?第二天还有多少桃子?第三天……
编写方法peach(int day),计算第day天的桃子数。
在main()方法中输入day(1~10),即你想知道第day天小猴子有多少桃子,调用peach()方法求该天的桃子数。

相关知识
为了完成本关任务,你需要掌握:1. 递归问题分析。
比如, 求5!. 可用如下思路:
递归求阶乘
设方法f(n)的功能为:求n!.
从上图可以看出:在调用方法f(5)计算5!的过程中,需要先调用方法f(4)来计算4!,……直至计算至f(1)为止。
然后逐层返回、计算,即可得到5!。

分析递归问题的关键:
(1)每次调用方法本身时参数的变化规律。
(2)递归结束的条件。
比如:
f(n)=f(n-1)*n (n>1)------转化规律
f(n)=1 (n=1)------递归结束条件

于是,求n!问题就变成了分段函数计算问题:根据n的值选择不同的表达式计算函数f(n)的值。
public static long fact(int n)
{
long t; //t表示n!
if(n==1)
t=1;
else
t= n*fact(n-1);
return t;
}

递归问题分析
要点:递进的规律,递归结束条件。
设方法peach(day)用于计算第day天的桃子数,
则递进规律是: peach(day)= 2*(peach(day+1)+1)
递归结束的条件是:day等于10时,peach(day)的值是1.

编程要求
根据提示,在右侧编辑器补充代码 。

测试说明
平台会对你编写的代码进行测试:

测试输入:1 ;
预期输出:
你想知道小猴子第几天的桃子数?请输入(1~10)
第1天的桃子数是1534

开始你的任务吧,祝你成功!

/*  猴子吃桃问题:小猴子摘了一堆桃子。第一天吃掉一半又多吃了1个,第二天吃了剩下的一半又多吃1个,以后每天都吃掉剩下的一半多一个。第10天发现只剩一个桃子了。问第一天摘了多少桃子?第二天还有多少桃子?第三天……
编写方法peach(int day),计算第day天的桃子数。
在main()方法中输入day(1~10),即你想知道第day天小猴子有多少桃子,调用peach()方法求该天的桃子数。
*/
/*请在下面的【】处填写代码*/
import java.util.Scanner;
public class Peach {

	public static void main(String[] args) {
		System.out.println("你想知道小猴子第几天的桃子数?请输入(1~10)");
		Scanner sc = new Scanner(System.in);
		int day;
		day = sc.nextInt();
		System.out.printf("第%d天的桃子数是%d\n",day,peach(day));
		sc.close();
	}

	//计算第day天的桃子数
	static int peach(int day) {
		int n;   //n表示第day天的桃子数  
       if (day== 10)
	   {
		   n=1;
		   return n;
	   }else{
		n=(peach(day + 1) + 1) * 2;
		return n;
		}

   }
}

第2关:用递归将整数逆序输出

任务描述
本关任务:编写方法reverse(int n):将一个整数n的各位数字逆序输出。要求每位数字占4列。

相关知识
为了完成本关任务,你需要掌握:
1.求整数n的个位、个位之前的数字组成的整数,2.递归问题分析。
比如, 求5!. 可用如下思路:

设方法f(n)的功能为:求n!.
从上图可以看出:在调用方法f(5)计算5!的过程中,需要先调用方法f(4)来计算4!,……直至计算至f(1)为止。
然后逐层返回、计算,即可得到5!。

分析递归问题的关键:
(1)每次调用方法本身时参数的变化规律。
(2)递归结束的条件。
比如:
f(n)=f(n-1)*n (n>1)------转化规律
f(n)=1 (n=1)------递归结束条件

于是,求n!问题就变成了分段函数计算问题:根据n的值选择不同的表达式计算函数f(n)的值。
public static long fact(int n)
{
long t; //t表示n!
if(n==1)
t=1;
else
t= n*fact(n-1);
return t;
}

思路提示:
设n的值位789,用递归的思路将n逆序的方法为:
(1)若n>0,则输出n的个位数,即 n%10;
(2)再处理除个位外的整数,即n=n/10。 这又是将整数n逆序问题。
重复以上两步,直至n的值为0,递归结束。

编程要求
根据提示,在右侧编辑器补充代码。

测试说明
平台会对你编写的代码进行测试:

测试输入:789;
预期输出:
9 8 7

开始你的任务吧,祝你成功!

/*编写递归的方法 reverse(int n):将一个整数n的各位数字逆序输出。*/
/*请在下面的【】处填写代码*/
import java.util.Scanner;

public class Reverse {

	public static void main(String[] args) {
		int n;
		Scanner sc = new Scanner(System.in);		
		n = sc.nextInt();
     //调用reverse(),将整数n的各位数字逆序输出
		reverse(n);
		sc.close();
	}
	
	//编写静态方法reverse(),逆序输出参数n的各位数字
	static void reverse(int n)
	{
		if(n<10)
		System.out.print("   "+n);	
		else{
			System.out.print("   "+(n%10));
			reverse(n/10)	;
		}
			
	}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值