Flatten在直接调用和在方法中调用时的工作方式不同

时间:2016-01-22 22:17:38

标签: arrays ruby flatten

我正在尝试编写一个方法,该方法将接受由字符01?组成的字符串,并返回由原始字符串表示的字符串集,将?作为通配符,可以是01。例如,如果输入为"011?0",则输出应为["01100", "01110"]

我写了以下代码:

def zerone str, arr
  qs = str.count("?") - 1
  i = 0
  while i < str.length
    if str[i] != "?"
      arr << str[i]
      i += 1
    else
      arr1 = Array.new(arr)
      arr2 = Array.new(arr)
      arr1 << "1"
      arr2 << "0"
      arr = [arr1, arr2]
      arr.map! {|x| zerone(str[i+1..-1], x)}
      break
    end
  end
 arr.flatten(qs)
end

当我致电zerone时,我得到一个平面阵列:

b = zerone("10???", [])
# => ["1", "0", "1", "1", "1", "1", "0", "1", "1", "0", "1", "0", "1", "0", "1", "1", "0", "1", "0", "0", "1", "0", "0", "1", "1", "1", "0", "0", "1", "0", "1", ...]

如果我更改了最后一行,那么方法会在不调用arr的情况下返回flatten,那么我就明白了:

b = zerone("10????", [])
# => [
  [
    [
      [["1", "0", "1", "1", "1", "1"], ["1", "0", "1", "1", "1", "0"]],
      [["1", "0", "1", "1", "0", "1"], ["1", "0", "1", "1", "0", "0"]]
    ],
    [
      [["1", "0", "1", "0", "1", "1"], ["1", "0", "1", "0", "1", "0"]],
      [["1", "0", "1", "0", "0", "1"], ["1", "0", "1", "0", "0", "0"]]
    ]
  ],
  [
    [
      [["1", "0", "0", "1", "1", "1"], ["1", "0", "0", "1", "1", "0"]],
      [["1", "0", "0", "1", "0", "1"], ["1", "0", "0", "1", "0", "0"]]
    ],
    [
      [["1", "0", "0", "0", "1", "1"], ["1", "0", "0", "0", "1", "0"]],
      [["1", "0", "0", "0", "0", "1"], ["1", "0", "0", "0", "0", "0"]]
    ]
  ]
]
b.flatten(3)
# => [
  ["1", "0", "1", "1", "1", "1"],
  ["1", "0", "1", "1", "1", "0"],
  ["1", "0", "1", "1", "0", "1"],
  ["1", "0", "1", "1", "0", "0"],
  ["1", "0", "1", "0", "1", "1"],
  ["1", "0", "1", "0", "1", "0"],
  ["1", "0", "1", "0", "0", "1"],
  ["1", "0", "1", "0", "0", "0"],
  ["1", "0", "0", "1", "1", "1"],
  ["1", "0", "0", "1", "1", "0"],
  ["1", "0", "0", "1", "0", "1"],
  ["1", "0", "0", "1", "0", "0"],
  ["1", "0", "0", "0", "1", "1"],
  ["1", "0", "0", "0", "1", "0"],
  ["1", "0", "0", "0", "0", "1"],
  ["1", "0", "0", "0", "0", "0"]
]

这就是我想要的。谁能说出发生了什么?

1 个答案:

答案 0 :(得分:1)

您正在递归地呼叫zerone并且qs每次都会更新并且不同。你不是在比较苹果和苹果的方法,以及你在撬开时手动做什么(当拆除压扁时)。