二进制字符串(Python)上的递归问题

时间:2019-04-11 20:17:44

标签: python recursion

我遇到这个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']

再次感谢您的帮助!我真的很想解决这个问题

谢谢!

2 个答案:

答案 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']