Scala中的尾递归阶乘函数

问题描述

我认为下面的阶乘函数是尾递归的,当我对其进行测试时,它可以正常工作到10并在20(负输出)时变得很奇怪,而当我插入100时,答案是0:

int GetIntFrom(object anything)

但是当我在其上方放置 @tailrec 时,会出现以下错误:

def factorial(n: Int,m: Int = 1): Int = 
    if (n == 0) m else fact(n-1,m * n)

我不明白为什么这个函数不是尾递归的。堆栈递归阶乘函数为:

error: not found: type tailrec

上面的函数在每次递归调用时在之后之后修改外部表达式。而第一个函数仅修改函数内部的内容。现在,要创建递归阶乘函数,他们要做的是在函数内部创建一个函数。但是,是否可以仅使用此问题中第一个函数的主体来创建递归阶乘函数?

此外,前一个函数中的“ m” 是变量吗?

编辑:现在,在完成answer中的建议之后, 如果函数不是尾递归的,我会收到错误消息:

def factorial(n: Int): Int = 
    if (n == 0) 1 else n * factorial(n-1)

解决方法

几件事:

  • 您必须导入@tailrec注释才能使用不带全名的注释:

    import scala.annotation.tailrec
    
    @tailrec
    def factorial(n: Int,m: Int = 1): Int = 
      if (n == 0) m else fact(n-1,m * n)
    

    没有@tailrec scalac仍将能够进行尾部递归优化,只是不会强制执行(如果TRO不可能,编译不会失败)。

  • 整数的容量有限-它是32位2-compliment,大于2 ^ 31-1的所有内容都会溢出并变为负数

因此,您必须导入批注或使用全名(@scala.annotation.tailrec)并用更大的名称替换IntLong也不够,更像BigInteger

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...