登录
首页 >  Golang >  Go问答

困惑于程序堆栈溢出的原因

来源:stackoverflow

时间:2024-02-11 22:45:22 450浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《困惑于程序堆栈溢出的原因》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我必须为编程作业编写以下内容,在运行代码并提供用户输入后,它会溢出。

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)

希望这有帮助!

到这里,我们也就讲完了《困惑于程序堆栈溢出的原因》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>