跳台阶问题

问题描述

一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法

方法1-递归

通过枚举可以发现:台阶级数和跳法有如下关系
级数 0 1 2 3 4 5 6 7 8
跳法 0 1 2 3 5 8 13 21 35…

从这个规律来看,可以发现,从第三级开始,跳法是一个斐波拉契数列

递归代码

/**************************
Author:tmw
date:2017-11-23
**************************/
#include <stdio.h>
#include <stdlib.h>

int jump_stairs_fibonacci(int n)
{
    int F[100];
    F[0] = 0;F[1] = 1;F[2] = 2;
    if(n<=2)
        return F[n];
    else
        return jump_stairs_fibonacci(n-1) + jump_stairs_fibonacci(n-2);
}

测试代码及结果

int main()
{
    printf("测试代码!\n");
    int n1,n2,n3,res1,res2,res3;

    n1=5;
    res1 = jump_stairs_fibonacci(n1);
    printf("跳%d个台阶共有%d种跳法\n",n1,res1);

    n2=10;
    res2 = jump_stairs_fibonacci(n2);
    printf("跳%d个台阶共有%d种跳法\n",n2,res2);

    n3=45;
    res3 = jump_stairs_fibonacci(n3);
    printf("跳%d个台阶共有%d种跳法\n",n3,res3);

    return 0;
}

这里写图片描述

方法2-递推

同样是斐波拉契数列,采用递归会发现,越到递归的后面,它的重复计算很多,时间花费比较大,因此采用递推,每个位置的值只需算一次,大大节省了时间。

递推代码

#include <stdio.h>
#include <stdlib.h>

int jump_stairs_fibonacci_recursive(int n)
{
    int a[3] = {0,1,2};//规律之外的额外列出
    if(n<3)
        return a[n];
    int i;
    int front_1 = 1;//当前所求值的前两位
    int front_2 = 2;//当前所求值的前一位
    int current;//当前所求值
    for(i=2;i<n;i++)
    {
        current = front_1+front_2;
        front_1=front_2;//更新front_1,相当于游标下移
        front_2=current;//更新front_2,相当于游标下移
    }

    return current;
}

递推代码测试结果

这里写图片描述

从运行时间上可以看出,递推法比递归法用时少的多。


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值