前言
随便两个递归题训练一下思维,挺好玩的
一、有规律的递归
1.题目描述
(1)求n!;
(2)求n项和;
(3)猴子吃桃:
2.规律
(1)找出递归的公式:
f(n) = f(n-1) * n;
f(n) = f(n-1) + n;
f(n) = 2f(n+1) + 2
(2)递归的终结点:
f(1) = 1;
(3)递归的方向必须走向终止节点
代码如下(n!):
public class RecursionDemo03 {
public static void main(String[] args) {
System.out.println(f(4));
}
public static int f(int n){
if(n==1){
return 1;
}else {
return f(n-1)+n;
}
}
}
代码如下(n项和):
public class RecursionDemo02 {
public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
// int n = sc.nextInt();
// int sum = 1;
// for(int i=1;i<=n;i++){
// sum *= i;
// }
// System.out.println(sum);
System.out.println(f(3));
}
public static int f(int n){
if(n==1){
return 1;
}else{
return f(n-1)*n;
}
}
}
代码如下(猴子吃桃):
public class RecursionDemo04 {
public static void main(String[] args) {
System.out.println(last(1));
System.out.println(last(2));
System.out.println(last(3));
}
public static int last(int day){
if(day==10){
return 1;
}else{
return last(day+1)*2+2;
}
}
}
二、无规律的递归
1.题目描述
代码如下:
public class RecursionDemo06 {
public static int totalNumber = 0;
public static int lastBottleNumber;
public static int lastCoverNumber;
public static void main(String[] args) {
buy(10);
System.out.println("喝了"+totalNumber+"瓶");
System.out.println("剩余"+lastBottleNumber+"个瓶子");
System.out.println("剩余"+lastCoverNumber+"个盖子");
}
public static void buy(int money){
int buyNumber = money / 2;
totalNumber += buyNumber;
int coverNumber = lastCoverNumber + buyNumber;
int bottleNumber = lastBottleNumber + buyNumber;
int allMoney = 0;
if(coverNumber >= 4){
allMoney += (coverNumber / 4) * 2;
}
lastCoverNumber = coverNumber % 4;
if(bottleNumber >= 2){
allMoney += (bottleNumber / 2) * 2;
}
lastBottleNumber = bottleNumber % 2;
if(allMoney >= 2){
buy(allMoney);
}
}
}