- 一个楼梯有n (n >= 1)级,每次走1级或两级,请问从1级台阶走到第n级台阶一共有多少种走法(假设一开始站在第0级台阶上)
package com.cskaoyan.homework;
import java.util.*;
/**
* 一个楼梯有n (n >= 1)级,每次走1级或两级,请问从1级台阶走到第n级台阶一共有多少种走法(假设一开始站在第0级台阶上)
* 分析:n=1 1 1种
* [1,0]
* n=2 1+1、2 2种
* [1,0]->[1+0,1]
* n=3 1+1+1、1+2、 2+1 3种
* [1,1]->[1+1,1]
* n=4 1+1+1+1、1+1+2、 1+2+1、 2+1+1、 2+2 5种
* [2,1]->[2+1,2]
* n=5 1+1+1+1+1、1+1+1+2、 1+1+2+1、 1+2+1+1、1+2+2、 2+1+1+1、2+1+2、 2+2+1、 8种
* [3,2]->[3+2,3]
* ... ...
*/
public class Work01 {
public static void main(String[] args) {
int[] arr = new int[]{0, 1};//假设为n=0的情况
System.out.println("请输入台阶数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while(n != 0){
arr = func(arr);
n--;
}
int sum = arr[0] + arr[1]; //注:arr[0]的值是最后一步为1阶梯的情况数
//arr[1]的值是最后一步为2阶梯的情况数
System.out.println("一共有" + sum + "种走法");
sc.close();
}
public static int[] func(int[] arr){
int[] tmp = new int[2];
tmp[0] = arr[0] + arr[1];
tmp[1] = arr[0];
return tmp;
}
}
测试:
- 计算n条直线最多能把平面分成多少部分? n >= 1
package com.cskaoyan.homework;
import java.util.*;
/**
* 计算n条直线最多能把平面分成多少部分? n >= 1
* 原理:第N条直线可以被前N-1条直线分为N段,对于 每1段则将平面分为两份,所以
* f(n)=f(n-1)+n。
* f(n-1)=f(n-2)+n-1
* ......
* f(1)=f(0)+1;
* f(0)=1;
*/
public class Work02 {
public static void main(String[] args) {
System.out.println("请输入直线数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(n + "条直线最多能把平面分成" + func(n) + "部分");
}
public static int func(int n){
if(n == 0)
return 1;
else
return func(n - 1) + n;
}
}
测试:
- 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 、 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个; 以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。 问第i(i的取值范围为[1, 10])天的桃子个数?
package com.cskaoyan.homework;
/**
* 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 、
* 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;
* 以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。
* 问第i(i的取值范围为[1, 10])天的桃子个数?
*
* 分析:
* 001 002 003 004 005 006 007 008 009 010
* n 10 4 1
*
* n -> n/2-1 -> (n/2-1)/2-1 ->...
* ...<- (((1+1)*2)+1)*2 <- (1+1)*2 <- 1
*/
public class Work03 {
public static void main(String[] args) {
int sum = func(9);
for(int i = 1;i <= 10;i++){
System.out.println("第" + i + "天的桃子个数为" + func(10 - i) +"个。");
}
}
public static int func(int n){
if(n == 0)
return 1;
else
return (func(n - 1) + 1) * 2;
}
}
测试: