【问题标题】:Recursion in Python and ScalaPython 和 Scala 中的递归
【发布时间】:2018-01-07 13:50:09
【问题描述】:

为什么这个 Scala 递归

def foo(id:Int): Int = { 
    if (id == 0) { return id } else { foo(id - 1) }
}
foo(2)

返回0,而这个Python递归返回None?

def foo(id):
    if id == 0:
        return id
    else:
        foo(id - 1)
foo(2)

Python 和 Scala 以何种方式处理递归和管理嵌套的激活记录?

【问题讨论】:

    标签: python scala recursion activation-record


    【解决方案1】:

    在 Scala 中,任何块都被评估为其最后一条语句的值。例如,你可以写:

    val myVal = {
      val t = 1
      val r = 8
      t + r
    }
    

    在这里,myVal 将评估为 9

    同样,您的 else 块计算为从 foo(id - 1) 返回的值(即使没有明确的 return 关键字),因此,只要 @到达 987654327@ 块(整个if 语句将被评估为foo(id - 1) 的结果,因为if 是方法主体中的最后一个(也是唯一一个)语句 - 这将是方法的返回值) .

    您也可以删除第一个 return 关键字:

    def foo(id:Int): Int = { 
      if (id == 0) id else foo(id - 1)
    }
    

    在 Python 中,情况并非如此;只有return 语句表示方法的返回值。如果您什么都不返回,则返回 None

    【讨论】:

      【解决方案2】:

      您的else 子句中需要return

      def foo(id):
          if id == 0:
              return id
          return foo(id - 1)
      

      这是return,您基本上是在为函数赋值。第二,Scala 在最后一条语句进行评估,而 Python 需要 return 关键字。所以如果foo(0)返回0,那么foo(0)包含值为0。由于返回nothing,函数没有任何值,默认为None.

      通过使用return,您将foo(id-1) 的值分配给foo(id)。但它是什么?这是它递归的地方,因为要获得foo(id-1) 的值,它必须运行该函数。这种情况一遍又一遍地发生,直到你得到 0。换句话说,return

      foo(n) = foo(n-1) = foo((n-1)-1) = foo(n-2) = ... = foo(n-n) = foo(0) = 0
      

      你可以看到id/nhere的稳步下降。

      【讨论】:

        【解决方案3】:

        您需要在else 子句中添加return

        def foo(id):
            if id == 0:
                return id
        
            return foo(id - 1)
        

        或者做类似的事情:

        def foo(id):
            return id if id == 0 else foo(id - 1)
        

        【讨论】:

        • 我知道这样Scala和Python的解决方案都返回相同的结果,但是为什么我需要添加第二个return语句呢?这些递归的处理方式有什么不同?
        • @w4bo,Scala 对最后一个表达式进行了 implicit 返回。 Python 没有,所以我们必须添加一个 explicit 返回。递归的处理方式可能相同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多