我正在尝试编写一个方法,该方法将接受由字符0
,1
和?
组成的字符串,并返回由原始字符串表示的字符串集,将?
作为通配符,可以是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", ...]
如果我更改了最后一行,那么方法会在不调用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"]
]
这就是我想要的。谁能说出发生了什么?
答案 0 :(得分:1)
您正在递归地呼叫zerone
并且qs
每次都会更新并且不同。你不是在比较苹果和苹果的方法,以及你在撬开时手动做什么(当拆除压扁时)。