821. 跳台阶

821. 跳台阶

⭐️难度:简单

⭐️类型:递归

📖题目:题目链接

🌟思路:

问题太复杂,没办法全局考虑,考虑分治法,

逐渐降低复杂度,把大问题分解成若干相似小问题(小问题能够直接解决)。

题中:

①最后一步一定 走一级或二级 ,问题倒退成 要解决的问题是走n-1级和n-2级有多少种方案;

但问题到这里还是不简单,继续倒推:

②假设剩下台阶数是n,倒数第二步一定走一级或二级,问题倒退成 要解决的问题是走n-1级和n-2级有多少种方案;

... ...

③不难发现,每一次分解,问题的解决思路是一致的,可以用同样的式子表达出来,最后问题会退化成走0 1 2个台阶有几种方案;

④显而易见,口算就能知道,走0 1 个台阶只有 1 种方案,走2 个台阶有 2种方案(走一级再走一级 和 一次走两级)。

📚题解:

找到方法后,代码其实并不复杂:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<vector>  // vector不需要.h
#include<list>
#include<set>  // // 可以用 set 和 multiset
#include<unordered_set> // 可以用 unordered_set 和 unordered_multiset
#include<map>  // 可以用 map 和 multimap
#include<unordered_map> // 可以用 unordered_map 和 unordered_multimap
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
#include<stack>

using namespace std;

int fangan(int n) {
    // 重点:找到递归出口
    if (n == 0 || n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }
    return fangan(n - 1) + fangan(n - 2);
}

int main() {

    int n;
    scanf("%d", &n);

    int res = fangan(n);
    printf("%d", res);

    return 0;
}

不断压栈弹栈的过程像深度优先遍历。

相关推荐
王老师青少年编程3 天前
csp信奥赛c++中的递归和递推研究
c++·算法·递归·递推·csp·信奥赛
老鼠只爱大米13 天前
LeetCode经典算法面试题 #70:爬楼梯(朴素递归、记忆化递归、动态规划等六种实现方案详解)
算法·leetcode·动态规划·递归·斐波那契·矩阵快速幂·爬楼梯
独断万古他化14 天前
【算法通关】二叉树中的深搜:DFS 递归解题套路
算法·二叉树·深度优先·dfs·递归
独断万古他化16 天前
【算法通关】递归:汉诺塔、合并链表、反转链表、两两交换、快速幂全解
数据结构·算法·链表·递归
阿里嘎多哈基米18 天前
速通Hot100-Day10——二叉树
算法·leetcode·二叉树·递归·平衡二叉树
A923A20 天前
【洛谷刷题 | 第五天】
算法·字符串·递归·洛谷
_小草鱼_21 天前
【搜索与图论】DFS算法(深度优先搜索)
算法·深度优先·图论·回溯·递归
百锦再22 天前
树形数据展示:树形表格与树形控件的深度对比(Vue实现)
javascript·vue.js·ecmascript·递归·tree·data·table
少许极端1 个月前
算法奇妙屋(三十一)-递归、回溯与剪枝的综合问题 4
算法·剪枝·回溯·递归
xiaoye-duck1 个月前
《算法题讲解指南:递归,搜索与回溯算法--二叉树中的深搜》--10.二叉搜索树中第k小的元素,11.二叉树的所有路径
c++·算法·深度优先·递归