首页 > 试题广场 >

在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N

[不定项选择题]
在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯(),当N=9时呢呢()?
  • 11
  • 144
  • 55
  • 89
想起来很久以前看的电影《少年班》
你需要爬11楼的时候,你倒回去一步只能待在第10楼或者第9楼。换句话说就是到达第9楼的方法次数加上第10楼的方法次数。
如果你待在第10楼,就得待在第9楼或者第8楼
如果你待在第9楼,就得待在第8楼或者第7楼
......
如果你待在第3楼,就得待在第1楼或者第2楼
爬1楼一种方法,
爬2楼两种方法。
爬3楼就是爬1楼方法次数加2楼的方法次数。
用数学表达就是:
a(11)=a(10)+a(9)=144
a(10)=a(9)+a(8)=89
a(9)=a(8)+a(7)=55
a(8)=a(7)+a(6)=34
a(7)=a(6)+a(5)=21
a(6)=a(5)+a(4)=13
a(5)=a(4)+a(3)=8
a(4)=a(3)+a(2)=5
a(3)=a(2)+a(1)=3
a(2)=2
a(1)=1
发表于 2019-09-04 16:48:45 回复(51)
#include<iostream>
using namespace std;
int p(int n)
{
if(n<=1)
return 1;
if(n==2)
return 2;
return p(n-2)+p(n-1);
}
int main()
{
int num;
cin>>num;
int result=p(num);
cout<<result<<endl;
return 0;
}



发表于 2019-09-09 08:58:30 回复(0)
代码已经有人贴出来了,讲一下个人的理解 当台阶只有一阶时,只能走一步,只有一种走法。 当两级台阶时,可以走一步,也可以一次走两步,有两种走法。 当三级台阶时,可以走一步,走三次。可以先走一步,再两步。也可以,先两步,再一步。总共三种方法。 可以看到当台阶是3时,第1级台阶选中之后(一种),剩下可以走的方式恰好是台阶为2时的总数,总的数量为前两个之和,所以是f(3)=f(1)+f(2)。即,f(n)=f(n-2)+f(n-1),总结起来刚好是一个斐波那契数列。
发表于 2019-08-29 23:56:26 回复(12)
发表于 2019-08-23 18:35:26 回复(10)
高中概率论
走2阶台阶的次数可能会出现0-5种情况,计算每一次总步数中的哪几步是走2阶台阶的所有可能
C(0,11)+C(1,10)+C(2,9)+C(3,8)+C(4,7)+C(5,6)=1+10+36+56+35+6=144
C(N,M)表示从M个数中,随机抽取N个数的所有情况
编辑于 2019-09-05 14:31:25 回复(11)
假设走n个台阶有F(n)种走法
那么最后一步可以分为还剩下一个或两个台阶时一步走完
F(n) = F(n-1) + F(n-2)
发表于 2019-08-26 19:16:32 回复(5)
斐波那契F(n)=F(n-1)+F(n-2)
发表于 2019-08-22 19:56:35 回复(0)
爬N楼的所有方法可分为两种,从N-1楼上一步加从N-2楼上两步。从N-1楼上一步的方法就等于爬N-1楼的方法。故f(N)=f(N-1)+f(N-2)
发表于 2020-05-04 20:07:41 回复(0)
    //非递归版
    private static int JumpFloor(int n) {
        int[] arr = new int[n];
        //0阶0种跳法
        arr[0] = 0;
        //1阶1种跳法
        arr[1] = 1;
        //2阶2种跳法
        arr[2] = 2;
        int i;
        for (i = 3; i < arr.length; i++) {
            //根据斐波拉契数列,后一位的跳法等于前两位的和
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[i - 1] + arr[i - 2];
    }

发表于 2019-09-14 19:00:15 回复(0)
排列组合,暴力解决😁
发表于 2019-08-21 20:55:15 回复(0)

你走到了第四阶梯,只有两种可能,从第二阶走两步上来或第三阶走一步上来,那走到第四阶的可能性就是走到第二阶的所有可能(+2)和第三阶的所有可能(+1),后面以此类推。

发表于 2020-12-22 19:29:47 回复(2)
  • 1节台阶只有1种走法,f(1); 2节台阶有2种走法,f(2); 3节台阶的第1步有2种走法: 第1步走1节, 后面2节台阶有f(2)种走法; 第1步走2步,后面1节台阶有f(1)种走法, 一共有f(1)+f(2)种走法. 故此, n节台阶的第1步有2种走法: 第1步走1节, 后面n-1节台阶有f(n-1)种走法; 第1步走2步,后面n-2节台阶有f(n-2)种走法, 一共有f(n-1)+f(n-2)种走法.
  • 代码实现:
     
发表于 2022-03-25 17:00:33 回复(0)
这个有点像斐波那契数列,就是一个递归
#include <iostream>
using namespace std;

int fun(int n)
{
	if (n == 1 || n == 2)
	{
		return n;
	}
	else if (n <= 0)
	{
		return 0;	
	} 
	else 
	{
		return fun(n-1) + fun(n-2);
	}
}

int main()
{
	int n;
	cin >> n;
	cout << fun(n);
} 


发表于 2022-03-25 14:26:37 回复(0)
发表于 2021-12-24 15:12:32 回复(2)
因为每次只能走1或2步,所以要到第n层楼梯,只需要; 1、走到第n-1层,再跨1步即可,那么这种方法刚好是走到n-1层的方法数; 2、走到第n-2层,再跨2步即可,那么这种方法刚好是走到n-2层的方法数; 接下来递推一下就明白了。
发表于 2020-03-01 15:32:31 回复(0)
两种解决思路递归和动态规划
1.递归
public int fun(int n){ if (n==1){ return 1;  } if (n==2){ return 2;  } return fun(n-2)+fun(n-1); }
2.这是动态规划的入门题目
public int fun2(int n){ if (n==1){ return 1;} if (n==2){ return 2;} int [] res=new int[n+1];  res[1]=1;  res[2]=2;  for (int i = 3; i < res.length; i++) {
        res[i]=res[i-2]+res[i-1];  } return res[n]; }

发表于 2022-03-08 20:46:02 回复(0)
leetcode 070 爬楼梯 dp解法
发表于 2020-07-31 14:47:06 回复(0)
斐波那契数列
发表于 2020-02-29 15:52:44 回复(0)
就是斐波那契数列的思想

发表于 2020-02-27 15:07:07 回复(0)
发表于 2019-12-25 14:04:54 回复(4)