【问题标题】:What's wrong with my Python code ( simulating POW(x,y))我的 Python 代码有什么问题(模拟 POW(x,y))
【发布时间】:2014-07-26 06:15:07
【问题描述】:

我正在练习递归,并尝试模拟 pow(x,y)。

这是我的代码:

def power(x,y):
    for y in range(1,y):
        return x * power(x,y)

为什么会这样:

力量(2,3) 回溯(最近一次通话最后): 文件“”,第 1 行,在 电源(2,3) 文件“C:/Python34/1.py”,第 3 行,上电 返回 x * 幂(x,y) TypeError: *: 'int' and 'NoneType' 不支持的操作数类型

【问题讨论】:

  • 提示:for 是一个纯粹的迭代构造,因此它不是递归函数的关键。当您使用递归函数时,通常会使用稍微不同的参数再次调用它 - 在您的情况下,使用不同的 y。你还需要一个“基本情况”——当你到达最内层的递归时会发生什么?你会返回什么?
  • 您正在使用循环和递归 - 您需要选择一个!
  • @Brionius:除非你想循环和yield递归,这(不像在循环中返回)是有意义的,并且在3.3之前的Python中经常需要模拟yield from......但是是的,否则,完全正确。

标签: python


【解决方案1】:

您似乎将迭代与递归混合在一起。

y 也有一个令人困惑的变量阴影。

这是一个纯粹的递归解决方案:

def power(x,y):
    if y == 0: return 1
    return x * power(x, y-1)

这是一个纯粹的迭代解决方案:

def power(x,y):
    v = 1
    for i in range(0,y):
       v *= x
    return v

【讨论】:

    【解决方案2】:

    表达式range(1,1) 是一个空集。

    如果给for 循环一个空集,您将跳过return 语句。

    如果跳过返回语句,函数将返回None

    第一次递归时,您使用y=1 调用函数,这会触发第一个条件。

    附:这不是您的程序的唯一问题。

    【讨论】:

      【解决方案3】:

      当函数跳过(或完成)for 循环时,它会以默认值 None 结束其工作
      所以有时你用return x * None 代替return x * power(x,y)

      您的函数适用于 Python,例如

      def power(x,y):
          for y in range(1,y):
              return x * power(x,y)
          return None
      

      顺便说一句:在 for 循环内使用 return 没有意义。第一个 return 将完成 for 循环。

      return X 表示end function at once and return value X

      【讨论】:

      • “BTW”部分很好地解释了他的混合迭代和递归到底做错了什么。
      • 我认为人们有时会像对待 Pascal 一样对待 return。在函数中的 Pascal 中,您可以随时设置返回值,但只有最后一行结束函数的执行。
      • 很好的洞察力。一些 Basics 的工作方式也类似。我从来没有建立过这种联系,但它解释了为什么至少有些人会写这样的东西。
      【解决方案4】:

      y 等于 1 时,您的函数返回 None

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多