【问题标题】:Convert recursive function to for and while loop [Python]将递归函数转换为 for 和 while 循环 [Python]
【发布时间】:2018-03-15 03:44:23
【问题描述】:

我有这些功能:

h(0) = 0
h(1) = 3
h(n) = h(n-1) + 2 * h(n-2), for n>= 2

我需要将其转换为 for 循环、while 循环和递归函数。我已经弄清楚了递归函数,但我似乎无法输出正确的答案。我在 for 循环中的尝试是这样的:

def hForLoop(n):
    sum = 3
    for i in range(2, n):
        sum = sum + ((i - 1) + 2 * (i - 2))
    return sum

我似乎无法弄清楚为什么我输出了错误的答案。一些见解将非常有用,我将非常感激。

【问题讨论】:

  • 我不同意一个是java,OP是用python编写的
  • 如果您准确地解释正在发生的事情,而不是含糊地说存在“问题”,这可能会有所帮助。代码根本不运行吗?它会抛出异常吗?它是否会产生不正确的结果,如果是,结果与您的预期有何不同?
  • @cowbert 第一个不是java,它是一个函数系统。我的任务是用 Python 编写这些函数系统。
  • 我的印象是语言不是问题,但是将递归函数转换为迭代代码的技术是 OP 正在寻找的。​​span>

标签: python python-3.x for-loop recursion while-loop


【解决方案1】:

这是仅存储系列中最后两个值的版本:

def hForLoop(n):
    prev, cur = 0, 3
    for i in range(2, n + 1):
        cur, prev = cur + prev * 2, cur
    return cur

【讨论】:

    【解决方案2】:

    问题出在你的 for 循环中,你将 sum 增加为 ((i - 1) + 2 * (i - 2))
    如果您了解原始函数,则应该将 sum 与之前存储在 h(i-1)h(i-2) 中的计算值相加。

    这是我对你的 for 循环函数的修复:

    def hForLoop(n):
        sum = [0,3]
        for i in range(2, n+1):
            sum.append((sum[i - 1]) + 2 * (sum[i - 2]))
        return sum[n]
    

    【讨论】:

      【解决方案3】:

      您需要为循环的下一次迭代存储h(n-1)h(n-2) 的中间值,在其中使用这些值来计算下一个h(n)

       def hLoop(n):
      
         # initally [h(2), h(1), h(0)]
         h = [3, 3, 0] 
      
         # And in the following: [ h(i), h(i-1), h(i-2)]
         for i in range(2,  n + 1):
            # calculate h(i)
            h[0] = h[1] + 2 * h[2]
            # move 'index' forward, h(n-1) becomes h(n-2), h(n-1) becomes h(n-0)
            h[2] = h[1]
            h[1] = h[0]
      
         return h[0]
      

      【讨论】:

        【解决方案4】:

        自带功能:

        h(0) = 0
        h(1) = 3
        h(n) = h(n-1) + 2 * h(n-2), for n>= 2
        

        你的实际代码是:

        h(0) = 0
        h(1) = 3
        h(n) = Σ((n-1) + 2 * (n-2)), for n>= 2
        

        看到区别了吗?

        【讨论】:

          猜你喜欢
          • 2013-07-20
          • 1970-01-01
          • 2013-05-31
          • 2019-05-30
          • 2020-09-05
          • 1970-01-01
          • 2019-05-11
          相关资源
          最近更新 更多