问题描述:
一个楼梯有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)。所以我们采用方法二,将中间的过程值记录下来
第二种解法:
利用数组分别记录中间的过程值,有用到过程值得时候可以直接在数组中找出,提高了计算效率,我们把这种叫做记忆化搜索算法