英文:
Recursion in Go for coding question: Product Sum
问题
我一直在使用Go语言练习编码面试题,其中一个例子是关于Product Sum的。基本上,你需要接收一个嵌套数组,并返回它的乘积和。
例如:[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
然而,当我尝试用代码实现时,我只能得到第一个例子的结果。
如果我将sum += cast
改为sum += cast * multiplier
,并将return sum * multiplier
改为return sum
,那么函数的结果就不符合预期了。我已经尝试在这个问题上进行递归堆栈的调试,但仍然感到困惑。
英文:
I've been practicing coding interview questions with this current example of Product Sum with Go. Basically, you need to take a nested array and return it's product sum.
Example: [1,3,[2,[5],-3],7] = 1 + 3 + 2*(2-3) + 3*(5) + 7 = 24
Which should also be equal to: 1 + 3 + 2*(2) + 2*(-3) + 3*5 + 7 = 24
However, when I try implementing this in code I can only get the first example.
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
}
If I change sum += cast
to sum += cast * multiplier
, and change return sum * multiplier
to return sum
- then the function doesn't work as expected. I've tried working through the recursive stack on this but am still confused.
答案1
得分: 0
根据你的代码,"array notation" 应该转换为以下方程式:
[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 {
// 乘数仅应用于当前切片中的整数。
sum += multiplier * cast
}
}
return sum
}
数组的和总是乘以其嵌套级别。
英文:
According to your code the "array notation" should be transformed to following equation:
[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
or
[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
In your interpretation each level of nesting increases the multiplier by one.
Could you paste the exact content of this exercise?
Edit:
To get 24 in result your code should look like this:
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
}
The sum of an array is always multiplied by the its level of nesting.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论