该程序堆栈溢出,我不确定为什么
This program is stack overflowing and I am not sure why
我不得不为编程作业编写以下代码,在 运行 代码和用户输入后它溢出了。
package main
import (
"fmt"
)
func hypercake(n int, k int) int {
combinations := func(n int, r int) int {
var factorial func(int) int
factorial = func(n int) int {
if n < 0 {
fmt.Print("Cannot take the factorial of a negative number.")
return -1
} else if n == 0 {
return 1
} else {
return factorial(n) * factorial(n-1)
}
}
if r >= 0 && r <= n {
ans := factorial(n) / (factorial(r) * factorial(n-r))
return ans
} else {
fmt.Print("Something was wrong with input")
return -1
}
}
sum := 0
if k > 0 {
if k == 1 {
return 1
} else {
for i := 0; i <= k; i++ {
sum += combinations(n, i)
}
}
return sum
} else {
fmt.Print("You must have a postive number of dimensions")
return -1
}
}
func main() {
var n, k int
fmt.Print("Type how many cuts in your cake.")
fmt.Scan(&n)
fmt.Print("Type how many dimensions in your cake.")
fmt.Scan(&k)
ans := hypercake(n, k)
fmt.Print(ans)
}
我曾尝试使用非常小的输入,因为我认为它只是超出了 n int 的范围,但没有用。
在我看来,你并不了解阶乘。
考虑 n! = n * (n - 1) * (n - 2) ... 你明白了。
它是 f(n) = n * f(n - 1)
但是您将阶乘实现为:
f(n) = f(n) * f(n - 1)
您最终会使用相同的参数调用相同的函数 - 因此堆栈溢出。
我建议您更改
return factorial(n) * factorial(n-1)
至
return n * factorial(n-1)
希望对您有所帮助!
我不得不为编程作业编写以下代码,在 运行 代码和用户输入后它溢出了。
package main
import (
"fmt"
)
func hypercake(n int, k int) int {
combinations := func(n int, r int) int {
var factorial func(int) int
factorial = func(n int) int {
if n < 0 {
fmt.Print("Cannot take the factorial of a negative number.")
return -1
} else if n == 0 {
return 1
} else {
return factorial(n) * factorial(n-1)
}
}
if r >= 0 && r <= n {
ans := factorial(n) / (factorial(r) * factorial(n-r))
return ans
} else {
fmt.Print("Something was wrong with input")
return -1
}
}
sum := 0
if k > 0 {
if k == 1 {
return 1
} else {
for i := 0; i <= k; i++ {
sum += combinations(n, i)
}
}
return sum
} else {
fmt.Print("You must have a postive number of dimensions")
return -1
}
}
func main() {
var n, k int
fmt.Print("Type how many cuts in your cake.")
fmt.Scan(&n)
fmt.Print("Type how many dimensions in your cake.")
fmt.Scan(&k)
ans := hypercake(n, k)
fmt.Print(ans)
}
我曾尝试使用非常小的输入,因为我认为它只是超出了 n int 的范围,但没有用。
在我看来,你并不了解阶乘。 考虑 n! = n * (n - 1) * (n - 2) ... 你明白了。 它是 f(n) = n * f(n - 1)
但是您将阶乘实现为: f(n) = f(n) * f(n - 1) 您最终会使用相同的参数调用相同的函数 - 因此堆栈溢出。
我建议您更改
return factorial(n) * factorial(n-1)
至
return n * factorial(n-1)
希望对您有所帮助!