Ruby 当我传入一个数组时,为什么连接会出错?

Ruby 当我传入一个数组时,为什么连接会出错?,ruby,recursion,concatenation,permutation,Ruby,Recursion,Concatenation,Permutation,我写了一个排列数组的方法(我意识到Ruby附带了一个排列函数,但我想练习算法)。我遇到了一个非常奇怪的错误,不知道为什么会发生这种情况 这是我的密码: def排列(arr) 排列(排列排序) 结束 def置换(arr,结果=[]) k=零 结果+=[arr] (arr.length-1)。时间为| 如果arr[i] [1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 2, 1] #我知道我可以像这样得到我想要的嵌套数组,但这不是重点 [1,2,3,1

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

这是我的密码:

def排列(arr)
排列(排列排序)
结束
def置换(arr,结果=[])
k=零
结果+=[arr]
(arr.length-1)。时间为|
如果arr[i]
该方法是递归的,每次连续调用时,我都将
arr
连接到带有
result+=[arr]
result
变量,因为我希望该方法返回嵌套数组,例如
[[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]
#我知道我可以像这样得到我想要的嵌套数组,但这不是重点
[1,2,3,1,3,2,2,1,3,2,3,1,1,3,1,2,3,2,1]。每个_切片(3)。到
=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

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

您被一个常见的Ruby错误咬到了—您正在修改原始数组,因为permutation()的'arr'参数是对数组的引用

尝试更改:

result += [arr]
致:

然后是普雷斯托

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

(顺便说一句,您仍然在使用此解决方案篡改原始的“arr”值,可能应该将其清理干净)

Hmm。。我仍然不明白为什么result+=arr有效而result+=arr无效。在这两种情况下,
arr
是否都是对数组的引用,唯一的区别是其中一个是用[]包装的?我建议使用arr.dup。将指针添加到数组的问题是,您稍后会更改数组,因此结果中的数组会更改。清理它,这样您就不会修改原始数组参数(因为您可能不希望这样),然后看看这是否也解决了您的问题。你几乎肯定需要一个dup在那里的某个地方。如果这不完全合理,请尝试在调用permutation()之前和之后打印“arr”。
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]