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

Flatten works differently when directly called and when called in a method

我正在尝试编写一个方法,该方法将采用由字符 01? 组成的字符串,以及 return 字符串集由原始字符串表示,以 ? 作为通配符,可以是 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", ...]

如果我更改最后一行,使方法 returns 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"]
]

这就是我想要的。谁能告诉我这是怎么回事?

您正在递归调用 zerone,并且 qs 会更新并且每次都不同。您不是在将苹果与苹果进行比较,方法正在做的事情以及您在撬动中手动做的事情(移除展平时)。