这是我的代码 这会在输出控制台上出现堆栈溢出错误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))
}
我不知道什么是错误 解决问题
答案 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()
方法。请检查代码,它会工作。