爬楼梯——递归与函数自调用算法

题目描述 Description

树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数
例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级
也可以第一次走两级,第二次走一级,一共3种方法。

输入输出格式 Input/output

输入格式:
输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30
输出格式:

不同的走法数,每一行输入对应一行输出

输入输出样例 Sample input/output

样例测试点#1

输入样例:

5

8

10

输出样例:

8

34

89

思路:

利用枚举抽象出一般表达式:

当n=0时,f(n)=1

n=1,f(n)=1

n=2,f(n)=2

n=3,fn=3

n=4,fn=5

f(2)=f(1)+f(0)

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

f(4)=f(3)+f(2)

.......

从上面分析可以归纳出一般表达式:f(n)=f(n-2)+f(n-1)

所以这题就是变形的斐波那契数列!

代码如下:

 1 #include <stdio.h>
 2 int dfs(int n)
 3 {
 4     if(n<3)//如果是1或2,分别有1、2种走法直接返回即可
 5     {
 6         return n;
 7     }
 8     else//否则递归!
 9     {
10         return dfs(n-1)+dfs(n-2);//利用一般表达式来求解(其实就是斐波那契数列)
11     }
12 }
13 int main()
14 {
15     int n;
16     scanf("%d",&n);
17     printf("%d\n",dfs(n));
18     return 0;
19 }
时间: 2024-10-25 18:51:20

爬楼梯——递归与函数自调用算法的相关文章

【LeetCode-面试算法经典-Java实现】【070-Climbing Stairs(爬楼梯)】

[070-Climbing Stairs(爬楼梯)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 题目大意 你正在爬一个楼梯,要走n步才

一步一步写算法(之爬楼梯)

原文:一步一步写算法(之爬楼梯) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下: 有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法? 在揭晓答案之前,朋友们可以自己先考虑一下: 这个人爬n层楼梯,那么它也不是一下子就可以爬这么高的,他只有两个选择,要么从n-2层爬过来,要么从n-1层爬过来.除此之外,他没有别的选择.此

C++算法之爬楼梯问题的代码

如下代码是关于C++算法之爬楼梯问题的代码. { if(layer <= 0) return; return; } (2)判断当前的层数是为1或者是否为2 { if(layer <= 0) return; if(layer == 1){ printf_layer_one(layer, stack, top); return; } if(layer == 2){ printf_layer_two(layer, stack, top); return; } return; } (3)对于2中提及的

面试算法题:爬楼梯,N级楼梯有多少种走法?

By Long Luo 个人博客链接 最近去面试时,在一家小公司面试时,公司小BOSS给我出了一道算法题: 一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,要求编写程序,求总共有多少种走法. 这个问题应该是一个很老的题目了,用中学数学来说,就是一个排列组合问题.当时拿到这个题目之后,首先想到使用递归的思想去解决这个问题: N级楼梯问题可以划分为:N-1级楼梯,N-2级楼梯,N-3级楼梯的走法之和. 先计算下0,1,2,3及楼梯有多少种走法: 1 --> 1 2 --> 11 2

爬楼梯算法

假设一个楼梯有 N 阶台阶,人每次最多可以跨 2 阶,求总共的爬楼梯方案数. 这里使用非递归实现:先不写代码,自己计算当楼梯数为1/2/3/4/5时,对应的爬法有1/2/3/5/8/13/21种.可以发现,随着楼梯数N的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2),知道这个规律后,使用下面的循环即可实现:public class Test {        public static void main(String[] args) {        S

菜鸡学算法--70. 爬楼梯

先来看题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方法可以爬到楼顶.1. 1 阶 + 1 阶2. 2 阶 示例 2: 输入: 3输出: 3解释: 有三种方法可以爬到楼顶.1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 作为一个菜鸡,看到题目直接懵逼,思路混乱. 解题大招: 首先,计算可执行的逻辑最后

(递归)3089:爬楼梯

描述 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法. 输入 输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30输出不同的走法数,每一行输入对应一行输出样例输入 5 8 10 样例输出 8 34 89 我の思考 我们需要走n个阶梯,我们的第一步,可能是1步,也可能是2步. 如果我们走了1步,就还要走n-1步,走了两步,还要走n-

c++ 递归之爬楼梯问题

问题:一老师爬楼梯,楼梯有n阶,一次只能走1阶或2阶,请问有几种走法? #include <iostream> using namespace std; int fun(int a) { static int i = 0; if(a==0||a==1) return 1; return fun(a-1)+fun(a-2); } int main() { int a = 4; cout<<fun(a)<<endl; return 0; } 运行结果: 5 原文地址:htt

Jarvis OJ - 爬楼梯 -Writeup

Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.cnblogs.com/WangAoBo/p/7222012.html 题目: 分析: 先看apk的外部特征,在模拟器中安装apk,如下: 每次点击爬一层楼按钮以爬的楼层会加1,爬到了,看FLAG按钮点击无效,于是猜测需要爬到指定的楼层才可以看到flag. 首先大致浏览apk的java代码(这里使用的