目录
一、问题描述
一个人上台阶,一次可上一个阶梯或两个,问这个人上十个阶梯有多少种走法?
二、实现代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int step(int n);
int main() {
//经典递归问题详解(跳台阶)
int n;
printf("请输入需要上几个台阶:");
scanf("%d", &n);
printf("上%d个台阶有%d种走法",n,step(n));
return 0;
}
int step(int n) {
//2.一定要有结束条件
if (n == 1 || n == 2) {
return n;
}
//1.找到最后要求的与它前一步或几步的关系
return n=step(n-1)+step(n-2);
}
三、运行结果
四、代码剖析
1.主要运用递归思想:
(1)写递归函数的核心:①找公式,②写结束条件
(2)本题中公式为 n=step(n-1)+step(n-2),就是找f(n)与他前一个f(n-1)或前几个f(n-?)的关系。结束条件:递归函数必须有一个或多个终止条件,这些条件定义了递归何时停止。如果没有终止条件,递归函数将无限期地调用自身,导致栈溢出错误。本题的结束条件为
if (n == 1 || n == 2) {
return n;
}2.本题分析思路:
f(n) = f(n-1) + f(n-2).
如果我们第一部选1个台阶,那么后面就会剩下n-1个台阶,也就是会有f(n-1)种走法.如果我们第一部选2个台阶,后面会有f(n-2)个台阶.因此,对于n个台阶来说,就会有f(n-1) + f(n-2)种走法.
因此,1个台阶f(1) = 1.
f(2) = 2,
f(3) = 3
f(4) = 5
f(5) = 8
f(6) = 13
f(7) = 21
f(8) = 34
f(9) = 55
f(10) = 89
f(11) = 89+55 = 144
f(12) = 144 + 89 = 233
.....
3.这类题可这样理解:
假设走到第n阶有f(n)种走法,走到第n+1阶有f(n+1)种走法;
则走到第n+2阶,则可分成两种情况:
一,最后一步是从第n阶直接登两级到第n+2阶
二,最后一步是从第n+1阶直接登一级到第n+2阶
由于从地面到第n阶,和到第n+1阶的走法已经知道
故从地面到第n+2阶的走法:
f(n+2)=f(n)+f(n+1)
n=1时,1种走法
n=2时,2种走法
n=3时,1+2=3种走法
n=3时,2+3=5种走法
结束~