在ktolin上使用递归的阶乘的Stackoverflow错误

时间:2017-05-28 05:54:41

标签: recursion kotlin factorial

这是我的代码 这会在输出控制台上出现堆栈溢出错误30次

fun main(args:Array<String>){
     var no:Int=Integer.parseInt(readLine())//read input from user and convert to Integer
      var ans:Int=calculateFact(no) //call function and store to ans variable
      println("Factorial of "+no+" is "+ans) //print result
}
fun calculateFact(no:Int):Int //function for recursion
{
if(no==0) {
    return 1 }
return (no*calculateFact(no))   
}

我不知道什么是错误 解决问题

3 个答案:

答案 0 :(得分:4)

你应该返回

no*calculateFact(no - 1)

no*calculateFact(no)

否则递归永远不会结束。

答案 1 :(得分:1)

除了已经指出的递归中的错误之外,值得一提的是,由于12大于13!,因此您的方法仍然只适用于Int的数字。您可以在13中存储的最大值。因此,对于数字BigInteger及以上,您实际上会随机获得&#34;随机&#34;由于溢出导致的结果。

如果您只使用8000,它将一直有效,直到调用堆栈太深并导致堆栈溢出,这发生在我的机器上的fun calculateFact(no: BigInteger): BigInteger { if (no == BigInteger.ZERO) { return BigInteger.ONE } return (no * calculateFact(no - BigInteger.ONE)) } fun main(args: Array<String>) { val no: BigInteger = BigInteger(readLine()) val ans: BigInteger = calculateFact(no) println("Factorial of $no is $ans") } 附近。

tailrec fun calculateFact(acc: BigInteger, n: BigInteger): BigInteger {
    if (n == BigInteger.ZERO) {
        return acc
    }
    return calculateFact(n * acc, n - BigInteger.ONE)
}

fun calculateFact(n: BigInteger) : BigInteger {
    return calculateFact(BigInteger.ONE, n)
}

fun main(args: Array<String>) {
    val n: BigInteger = BigInteger(readLine())
    val ans: BigInteger = calculateFact(n)
    println("Factorial of $n is $ans")
}

如果您想处理大于此数字的数字,可以使用tailrec函数(此特定解决方案取自this文章):

turtle.penup()

这适用于数十万的数字,你的问题将成为运行所需的时间而不是内存限制。

答案 2 :(得分:1)

 fun main(args:Array<String>) {
     var no:Int = Integer.parseInt(readLine()) //read input from user and convert to Integer
     var ans:Int=calculateFact(no) //call function and store to ans variable
     println("Factorial of "+no+" is "+ans) //print result
}

fun calculateFact(no:Int):Int { //function for recursion 
    if(no==0) {
        return 1 
    }
    return (no*calculateFact(no - 1)) // you forgot to decrease the no here.
}

如果你没有减去no,那么它将一直调用calculateFact()方法。请检查代码,它会工作。