go - 计算 Go 中唯一的括号组合总数

标签 go

比如输入是3,那么3对括号的可能组合,即:()()(),分别是()()(), ()(()), (())(), ((())), 和 (()())。当输入为 3 时,总共有 5 种组合,因此您的程序应该返回 5。
我尝试使用这样的 Javascript:

function BracketCombinations(num) {

    function calculatePOssibilities (open, closed) {
        if (open === 0 && closed === 0)
            return 1;
        var res = 0;
        if (open > 0)
            res += calculatePOssibilities(open - 1, closed);
        if (closed > open)
            res += calculatePOssibilities(open, closed - 1);
        return res;
    }
    // code goes here  
    return calculatePOssibilities(num, num);
}
我知道,我可以将该代码转换为 Go,但如何使其更多 高效 ?

最佳答案

func BracketCombinations(n int64) int64 {
    var i big.Int
    i.Binomial(2*n, n)
    i.Div(&i, big.NewInt(n+1))
    return i.Int64()
}
我相信这会很有效,但为了进行适当的基准测试,我们需要建立一些测试参数。至少,它是一种非递归实现,因此它在大多数方面都应该胜过您的原始代码。

我是如何找到解决方案的:
我运行您的 javascript 代码以输出一系列数字。然后我在 Online Encyclopedia of Integer Sequences 中搜索了这一系列数字。 ,并找到了该系列的正式名称(加泰罗尼亚数字),包括推导它的公式。然后我发现binomial(2n,n)/(n+1)公式应该最容易实现,因为 Go 标准库提供了一个二项式函数。

关于go - 计算 Go 中唯一的括号组合总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67411266/

相关文章:

pointers - atomic.AddInt64 导致无效的内存地址或零指针取消引用

go - `bufio.Writer` 还是 `io.Writer`?

go - 有没有一种方法可以编写通用代码来查明 slice 是否包含 Go 中的特定元素?

json - json。在Go中解码TCP连接并同时记录原始数据

go - 确保 Go channel 不阻塞的可靠方法

go - 使用 golang 创建 veracrypt 卷

parsing - 更改 time.Time 时区而不重新解析

go - "illegal base64 data"尝试 base64 解码时

go - 如何从github获取go-socket.io并在Go中使用

go - 在函数中传递接口(interface) slice 并解码到它的项目中