gpt4 book ai didi

ruby - 当我传入一个数组时,为什么我的串联会搞砸?

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:23 25 4
gpt4 key购买 nike

我写了一个排列数组的方法(我知道 Ruby 自带排列函数,但我想练习算法)。我遇到了一个非常奇怪的错误,不知道为什么会这样。

这是我的代码:

def permute(arr)
permutation(arr.sort)
end

def permutation(arr, result=[])
k = nil
result += [arr]
(arr.length-1).times do |i|
if arr[i] < arr[i+1]
k = i
end
end
if k.nil?
return result
else
l = -1
arr.length.times do |i|
if arr[k] < arr[i]
l = i
end
l = nil if l == -1
end
arr[k], arr[l] = arr[l], arr[k]
arr = arr[0..k] + arr[k+1..-1].reverse
return permutation(arr, result)
end
end

该方法是递归的,在每次连续调用时,我将 arr 连接到我的 result 变量,并使用 result += [arr] 因为我希望该方法返回嵌套数组,例如[[1, 2, 3], [1, 3, 2]..]

但是,当我调用这个方法时,它给了我一个完全奇怪的结果。

permute([1,2,3])
=> [[1, 3, 2], [2, 3, 1], [2, 3, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]]

为什么最后三个结果都是[3,2,1]?其他数组也不正确。真正奇怪的是,我可以通过将串联更改为 result += arr 来解决此问题。通过此更改,我得到以下信息:

permute([1,2,3])
=> [1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 2, 1]

#I know that I can get my desired nested array like so, but that's beside the point
[1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 2, 1].each_slice(3).to_a
=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

我没有得到我想要的嵌套数组,但输出给出了正确的排列。为什么它现在可以正常工作,但我使用的不是 result += [arr]?这是 Ruby 错误,还是我遗漏了什么?

最佳答案

你正被一个常见的 ruby​​ 错误所困扰——你正在修改原始数组,因为 permutation() 的 'arr' 参数是对数组的引用

尝试改变:

result += [arr]

到:

result += [arr.dup]

然后转瞬即逝!

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

(顺便说一句,你仍然在用这个解决方案修改原始的 'arr' 值,可能应该清理它)

关于ruby - 当我传入一个数组时,为什么我的串联会搞砸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com