爬楼梯问题的2种解法(递归+记忆化搜索)

8 篇文章 0 订阅

问题描述:

一个楼梯有N节,每次只能走1步或者2步,请问走完N节楼梯有几种走法?

解法:

#include <stdio.h>

//递归解法
int fun1(int n)
{
    if(n==1||n==2)
        return n;
    return fun1(n-1)+fun1(n-2);
}

//记忆化搜索解法
int fun2(int n)
{
	int a[10] = { 0 };
	a[1] = 1;
	a[2] = 2;
	int i = 3;
	for (i = 3; i <= n; i++)
	{
		a[i] = a[i - 1] + a[i - 2];
	}
	return a[i-1];
}

int main(void)
{
   int f7 = fun1(7);
   int f8 = fun2(8);
   printf("%d\n",f7);
   printf("%d\n",f8); 
 
    return 0;
}

第一种解法:

走N步的问题可以化解为走N-1步的子问题和再走1步的解法,例外还可以化解成走N-2步的子问题和再走2步的解法,所以

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

这种解法的缺点就是会有重复的计算量,比如f(5)=f(4)+f(3),f(4)=f(3)+f(2),f(3)=f(2)+f(1),每次的计算都要递归到f(2)和f(1)再进行相加计算后一次向上计算(3),f(4)。所以我们采用方法二,将中间的过程值记录下来

第二种解法:

利用数组分别记录中间的过程值,有用到过程值得时候可以直接在数组中找出,提高了计算效率,我们把这种叫做记忆化搜索算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值