matrix上的下楼梯问题
Description
XiaoMi walks down stairs from two floors. There are hs
0<h<20,0<s<20
How many schemes are there for downstairs?
Input
Two num: h,s
Output
The number of schemes.
Sample Input
1 3
Sample Output
1
题目叙述如上,刚拿到此题时丝毫没有头绪,遂上网搜索下楼梯递归,得到下楼梯的最初始的题目:
爬楼梯问题,n阶楼梯,一次迈一步或者两步。一共有几种方法?
此题的思路为:
(1)直接思考:设f(x)=【剩x阶时,迈楼梯的方法总数】。首先迈出第一步,如果一次迈一阶,剩下x-1阶,方法总数为f(x-1);如果一次迈两阶,剩下x-2阶,方法总数为f(x-2);这里f(x-1) f(x-2)都是我们不知道的。这里只是找出一个递推关系式。即f(x)=f(x-1)+f(x-2)。容易发现,f(1)=1,f(2)=2。
(2)通过不断举例来找到规律:
如果x为1时,只可以迈一步,共有一种方法。
如果x为2时,可以一次迈一步,也可以一次迈两步,共有两种方法。
如果x为3时,可以先1,后2;可以先2,后1;也可以1,1,1;共有三种方法。满足f(1)+f(2)。
如果x为4时,1,1,1,1; 1,2,1; 1,1,2; 2,1,1; 2,2; 共有五种方法。满足f(2)+f(3)。
......
发现规律:f(x)=f(x-2)+f(x-1);
总结:
做递归函数时,我们不妨先从较小的数开始做实验,找出潜在的数学规律,抽象成数学问题。【即找出递推关系式】。这样比直接思考问题要简单一些。
实现代码如下:
#include <stdio.h> int f(int x){ if(x==1) return 1; if(x==2) return 2; return (f(x-1)+f(x-2)); } int main(){ int n; scanf("%d",&n); printf("%d",f(n)); return 0; }
现在回到matrix上的题目,发现下楼梯的阶数从1到2阶变成1到s阶,以相同的思路来思考:
首先迈出第一步,如果一次迈一阶,则方法总数为f(h-1);
如果一次迈两阶,则方法总数为f(h-2);
如果一次迈三阶,则方法总数为f(h-3);
⋯⋯
如果一次迈s阶,则方法总数为f(h-s);
于是想到通过循环来实现这一过程:
int sum=0;
for(int i;i<=s;i++)
sum=sum+f(h-i);
现在开始寻找递归结束的条件:
当h-i<0时,方法数为0;
当h-i=0时,方法数为1(一次走完所有楼梯);
当h-i=1时,方法数也为1(两次走完所有楼梯,且其中一次是走一阶);
由此,我们可以写出函数:
int f(int h,int s) { int sum=0; if(h<0) return 0; else if(h==0) return 1; else if(h==1) return 1; else{ for(int i=1;i<=s;i++) { sum=f(h-i,s)+sum; } return sum; } }
此题主要部分完成,接下来实现main函数即可.
本题代码如下:
#include<stdio.h> int f(int a,int b) { int sum=0; if(a<0) return 0; else if(a==0) return 1; else if(a==1) return 1; else{ for(int i=1;i<=b;i++) { sum=f(a-i,b)+sum; } return sum;} } int main() { int h,s; scanf("%d%d",&h,&s); printf("%d\n",f(h,s)); return 0; }
原题及思路和解答来自http://blog.renren.com/share/273685802/11043344928
十分感谢.