• 递归问题1


    经典递归问题

    递归需要满足 3 要素:

    1、一个父问题可以拆分成若干个子问题,并且若干子问题的结果汇总起来就是父问题的答案。

    2、父问题和子问题,解题思路必须完全一致,只是数据规模不同。

    3、存在终止条件。

    问题在不断拆分的同时,一定要在某个节点终止拆分,得到一个明确的答案。

    问题一:假设有 n 个台阶,每次可以跨 1 个台阶或者 2 个台阶,请问走完这 n 个台阶一共有多少种走法?

    1、假设有 1 个台阶,一共有(1) 种走法

    2、假设有 2 个台阶,一共有 2 种走法 【1,1】【2】

    3、假设有 3 个台阶,一共有()种走法?【1,1,1】【1,2】【2,1】


    可以根据第一步的走法进行分类

    第一类是第一步走了 1 个台阶

    第二类是第一步走了 2 个台阶

    所以 n 个台阶的走法就等于先走 1 个台阶后,n-1 个台阶的走法+先走 2 个台阶后,n-2 个台阶的走法。

    f(n) = f(n-1)+f(n-2)
    

    f(1) = 1,能否作为终止条件?

    n = 2,f(2) = f(1)+f(0),如果终止条件只有一个 f(1) = 1,f(2) 就无法求解, 因为 f(0) 的值无法确定,

    把 f(2) = 2 作为一个终止条件

    终止条件有两个:

    f(1) = 1;

    f(2) = 2;

    n = 3,f(3) = f(2)+f(1) = 3

    n = 4,f(4) = f(3)+f(2) = 3 + 2 = 5

    递推公式

    f(1) = 1;
    f(2) = 2;
    f(n) = f(n-1)+f(n-2);
    

    推导出递归代码

    int f(int n){
    	if(n == 1) return 1;
    	if(n == 2) return 2;
    	return f(n-1) + f(n-2);
    }
    

    Java代码

    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"个台阶共有"+f1(i)+"种走法");
        }
    }
    
    public static int f1(int n){
        if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }else {
            return f1(n-1) + f1(n-2);
        }
    }
    

    问题二:n!的计算

    public static void main(String[] args) {
        for (int i = 5; i < 10; i++) {
            System.out.println(i+"的阶乘为:"+f2(i));
        }
    }
    
    //递归
    public static int f1(int n){
        if(n==1){
            return 1;
        }else {
            return f1(n-1)*n;
        }
    }
    //循环
    public static int f2(int n) {
        if(n == 1) return 1;
        int sum = 1;
        for (int i = 1; i <= n ; i++) {
            sum = sum * i;
        }
        return sum;
    }
    
  • 相关阅读:
    SDP(12): MongoDB-Engine
    SDP(11):MongoDB-Engine功能实现
    SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
    React Native(五)——获取设备信息react-native-device-info
    React Native(四)——顶部以及底部导航栏实现方式
    去掉a标签
    React Native(三)——推送jpush-react-native
    react native (一)
    《JavaScript 秘密花园》
    正则表达式(overall)
  • 原文地址:https://www.cnblogs.com/k-class/p/13774012.html
Copyright © 2020-2023  润新知