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

测试:
在这里插入图片描述

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