【发布时间】:2020-06-05 16:20:30
【问题描述】:
问题陈述
假设有一个楼梯,您可以用 1 步、2 步或 3 步爬上楼梯。如果楼梯有 n 个台阶,你有多少种可能的方式爬楼梯?写一个递归函数来解决这个问题。
例子:
n == 1 然后答案 = 1
n == 3 然后回答 = 4 ,
输出为 4,因为我们有四种方式 可以爬楼梯:1 步 + 1 步 + 1 步
1 步 + 2 步
2 步 + 1 步
3 步
n == 5 然后回答 = 13
解决方案
def staircase(n):
if n <= 0:
return 1
if n == 1:
return 1
elif n == 2:
return 2
elif n == 3:
return 4
return staircase(n - 1) + staircase(n - 2) + staircase(n - 3)
我了解递归的基本原理。
我认为递归是一种解决问题的方法,首先解决问题的较小部分,然后将结果组合起来得到最终答案。我们为最小的部分设置了一个基本条件,并从那里开始构建我们的解决方案。
从这个意义上说,我理解阶乘、回文、斐波那契和河内塔等著名的递归问题,很明显,较小的部分组成了较大的部分,递归可以优雅地解决问题。
但是对于楼梯问题,我根本无法理解作者是如何提出这个解决方案的以及为什么它会起作用?
我正在寻求更多帮助来理解和理解这个解决方案背后的思考过程,而不是程序本身,因为我已经查看了堆栈跟踪并对它的执行有一个很好的了解。
对于那些感兴趣的人,链接的帖子对同样的问题有更深入的解释
【问题讨论】:
-
要爬 n>3 级楼梯,你要么 [a] 先爬 1 级楼梯然后爬 n-1 级楼梯,[b] 先爬 2 级楼梯然后爬 n-2 级楼梯,要么 [c] ] 先爬 3 级楼梯,再爬 n-3 级楼梯。数一下,是 S(n) = S(n-1) + S(n-2) + S(n-3)