- 一個樓梯有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;
}
}
測試: