【问题标题】:Replacing recursion with while loop (stair climbing puzzle): Python用while循环替换递归(爬楼梯):Python
【发布时间】:2014-10-20 11:39:02
【问题描述】:

我正在练习用 while 循环替换递归,但我遇到了以下问题。

如果你一次只能走 1 或 2 条楼梯,你有多少种方法可以上 n 长的楼梯?

递归解决方案非常简单:

def stairs(n):
  if n <= 1:
    return 1
  else:
    return stairs(n-2) + stairs(n-1)

我觉得迭代程序的结构应该是这样的:

def stairs_iterative(n):
  ways = 0
  while n > 1:
    # do something
    ways +=1
  return ways

但我不知道我需要在#do something 部分中添加什么。有人能帮我吗?伪代码就好了!

【问题讨论】:

    标签: python fibonacci


    【解决方案1】:

    这相当于动态编程的自上而下(递归)方法与自下而上(迭代)方法。

    既然您知道对于输入 n,您需要 stairs(p) 的所有值来表示 0 &lt;= p &lt;= n。您可以从p = 0 开始迭代计算stairs(p),直到达到p = n,如下所示:

    def stairs(n):
        table = [1, 1]  # p = 0 and p = 1
        for i in range(2, n + 1):
            table.append(table[i - 2] + table[i - 1])
        return table[n]
    

    【讨论】:

    • 顺便说一句,对于这个简单的任务,您只需存储 2 个以前的值,而不是整个表。
    • @monkeybiz7 这是带有偏移的斐波那契。
    【解决方案2】:

    与@univerio 不同的方法是使用列表作为堆栈:

    def stairs_it(n):
        res = 0
        stack = [n]
        while len(stack) > 0:
            curr = stack[0]
            stack.remove(curr)
            if curr == 0:
                res += 0
            elif curr == 1:
                res += 1
            elif curr == 2:
                res += 2
            else:
                stack.append(curr-1)
                stack.append(curr-2)
        return res
    

    【讨论】:

    • 好的,你得解释一下。我没有看到它是如何做到原版的。
    • @cHao 这听起来有点像命令而不是请求 :) 我会把孩子们塞进床上并添加解释后回来,尽管我认为这种方法会更“直观” ' 比上面的记忆
    • 我正在弄清楚它是如何工作的。您基本上是在进行“数据递归”,并使用堆栈来存储数据,而不是将其传递给自己。不过,这需要一些时间来推理。 (顺便说一句,当n 为 0 时,原始返回 1。)
    • @cHao 是的,你明白了!人们可能会争论 n=0 应该返回 1 还是 0,但无论哪种方式,在函数的开头添加条件都很容易。
    猜你喜欢
    • 2015-10-11
    • 2021-05-03
    • 2014-08-05
    • 2020-08-03
    • 2015-02-22
    • 2014-10-27
    • 1970-01-01
    • 2013-02-01
    • 2018-08-15
    相关资源
    最近更新 更多