第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) ;
}
}
}