我遇到这个python问题的问题;在过去的一个小时中,我一直在为此工作,但我完全陷入困境。.我对递归仍然不太满意,而且问题越来越难解决,因此非常感谢任何帮助!
问题很简单,我需要编写一个将n和w作为输入的函数;其中n是位字符串的大小,w是字符串中的个数。输出应该是其所有排列。
示例:
n = 3,w = 1:['001','010','100']
n = 4,w = 2:['0011','0101','0110','1001','1010','1100']
这是我到目前为止编写的内容,但是我对其进行了调整或在python visualizer中运行,但我仍然无法弄清楚:
def genBinStr2(n,w):
if n <=0 or w <= 0 :
return [""]
X = genBinStr2(n-1,w)
Y = genBinStr2(n-1,w-1)
M = []
for s in X:
M.append("0"+s)
for m in Y:
M.append("1"+s)
return M
print (genBinStr2(3,1))
输出为:
runfile('/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /Revision/untitled0.py', wdir='/Users/Rayan/Desktop/AUB Spring 2019/EECE 230 /Revision')
['000', '001', '011', '111']
再次感谢您的帮助!我真的很想解决这个问题
谢谢!
答案 0 :(得分:2)
您的开幕词不允许出现w = 0的情况。
例如: print(genBinStr2(3,0))将返回['']而不是[“ 000”]
还有一个返回结果,即1的个数小于w
这是我使用递归解决问题的方法:
def genBinStr2(n,w):
if n == 1:
if w == 1:
return["1"]
if w == 0:
return["0"]
if n <= 0 or w < 0:
return [""]
X = genBinStr2(n-1,w)
Y = genBinStr2(n-1,w-1)
M = []
if w < n:
for s in X:
M.append("0"+s)
if w >=1:
for m in Y:
M.append("1"+m)
return M
输出:
>>> print (genBinStr2(3,2))
['011', '101', '110']
>>> print (genBinStr2(3,1))
['001', '010', '100']
>>> print (genBinStr2(4,3))
['0111', '1011', '1101', '1110']
答案 1 :(得分:0)
如果您不介意不使用递归,请使用itertools
from itertools import combinations
def ones(n, w):
combos = [dict.fromkeys(x, "1") for x in combinations(range(n), w)]
return ["".join([x.get(i, "0") for i in range(n)]) for x in combos]
ones(4, 2)
输出:
['1100', '1010', '1001', '0110', '0101', '0011']