Flatten 在直接调用和在方法中调用时的工作方式不同
Flatten works differently when directly called and when called in a method
我正在尝试编写一个方法,该方法将采用由字符 0
、1
和 ?
组成的字符串,以及 return 字符串集由原始字符串表示,以 ?
作为通配符,可以是 0
或 1
。例如,如果输入是 "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
会更新并且每次都不同。您不是在将苹果与苹果进行比较,方法正在做的事情以及您在撬动中手动做的事情(移除展平时)。
我正在尝试编写一个方法,该方法将采用由字符 0
、1
和 ?
组成的字符串,以及 return 字符串集由原始字符串表示,以 ?
作为通配符,可以是 0
或 1
。例如,如果输入是 "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
会更新并且每次都不同。您不是在将苹果与苹果进行比较,方法正在做的事情以及您在撬动中手动做的事情(移除展平时)。