#include <stdio.h> /* 递推: 目标是想求n级台阶有多少种走法,现在先假设已经走完了n级台阶同时假设存在f(n)种走法可以走完n级台阶, 现在退回到走完这n级台阶的上一步,即走完这n级台阶的最后一步,最后一步有两种可能的情况, 第一种情况是这一步只走了1级台阶,即完成最后一步之前已经走了n-1级台阶,假设走完n-1级台阶存在f(n-1)种走法; 第二种情况是最后一步走了两级台阶,即完成最后一步之前已经走了n-2级台阶,又假设走完n-2级台阶存在f(n-2)种走法, 那么理一下思路:完成n级台阶最后一步之前需要走完n-1级台阶或者n-2级台阶, 因为n级存在台阶f(n)种走法,n-1级台阶存在f(n-1)种走法,n-2级台阶存在f(n-2)种走法,所以f(n)=f(n-1)+f(n-2); 继续递推,完成n-1级台阶的最后一步时之前肯定走了n-2或n-3级台阶,再继续递推,走完n-2级台阶的最后一步时之前肯定走了n-3或n-4级台阶, 一直递推下去,则有:f(n) = f(n-1)+f(n-2) , f(n-1) = f(n-2)+f(n-3) , f(n-2) = f(n-3)+f(n-4) , f(n-3) = f(n-4)+f(n-5) , ...... , f(4) = f(3)+f(2) , f(3) = f(2)+f(1) 至此,递推结束。 那么如果只有一个台阶只有一种解法f(1)=1;f(2)=2有两种可以一次一级台阶也可以一次跨两个台阶 */ int fun(int n) { if(n<=2) return n; else return fun(n-1)+fun(n-2); } int main() { int n; int cnt=0; scanf("%d",&n); cnt=fun(n); printf("%d\n",cnt); }
//法二循环 int main() { int n; int a[50]={0}; int cnt=0; scanf("%d",&n); a[0]=0; a[1]=1; a[2]=2; for(int i=3;i<=n;i++) { a[i]=a[i-1]+a[i-2]; } printf("%d\n",a[n]); }