Day08 JavaBasic05

  1. 一個樓梯有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;
    }
}

測試:
在這裏插入圖片描述

  1. 計算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;
    }
}

測試:
在這裏插入圖片描述

  1. 猴子第一天摘了若干個桃子,當即吃了一半,還不解饞,又多吃了一個; 、 第二天,喫剩下的桃子的一半,還不過癮,又多吃了一個; 以後每天都喫前一天剩下的一半多一個,到第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;
    }
}

測試:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章