Go 中的递归编码问题:乘积总和

时间:2021-08-01 19:12:32

标签: go recursion

我一直在用 Go 的当前产品总和示例练习编码面试问题。基本上,您需要获取一个嵌套数组并返回它的乘积总和。

示例:[1,3,[2,[5],-3],7] = 1 + 3 + 2*(2-3) + 3*(5) + 7 = 24

这也应该等于:1 + 3 + 2*(2) + 2*(-3) + 3*5 + 7 = 24

但是,当我尝试在代码中实现它时,我只能得到第一个示例。

func ProductSum(array []interface{}) int {
    sum := productSum(array, 1)
    fmt.Println(sum)
    return sum
}

func productSum(array SpecialArray, multiplier int) int {
    sum := 0
    for _, el := range array {
        if cast, ok := el.(SpecialArray); ok {
            sum += productSum(cast, multiplier+1)
        } else if cast, ok := el.(int); ok {
            sum += cast
        }
    }
    return sum * multiplier
}

如果我将 sum += cast 更改为 sum += cast * multiplier,并将 return sum * multiplier 更改为 return sum - 那么该函数无法按预期工作。我已经尝试通过递归堆栈来解决这个问题,但仍然很困惑。

1 个答案:

答案 0 :(得分:0)

根据您的代码,“数组符号”应转换为以下等式:

[1,3,[2,[5],-3],7] = 1*(1 + 3 + 2*(2 + 3 * (5) - 3) + 7) = 1 + 3 + 2*(2 - 3 + 15) + 7 = 11 + 14 * 2 = 39

[1,3,[2,[5],-3],7] = 1*(1 + 3 + 2*(2 + 3 * (5) - 3) + 7) = 1 + 3 + 2*(-1) + 6 * 5 + 7 = 11 - 2 + 30 = 39

在您的解释中,每一级嵌套都会使乘数增加一。

你能粘贴一下这个练习的确切内容吗?

编辑:

要获得 24 的结果,您的代码应如下所示:

func ProductSum(array []interface{}) int {
    sum := productSum(array, 1)
    fmt.Println(sum)
    return sum
}

func productSum(array []interface{}, multiplier int) int {
    sum := 0
    for _, el := range array {
        if cast, ok := el.([]interface{}); ok {
            sum += productSum(cast, multiplier+1)
        } else if cast, ok := el.(int); ok {
            // Multiplier is applied only to integers in current slice.
            sum += multiplier * cast
        }
    }
    return sum
}

数组的总和总是乘以它的嵌套级别。