【问题标题】:Recursive problem on binary strings (Python)二进制字符串的递归问题(Python)
【发布时间】:2019-09-02 13:28:42
【问题描述】:

我遇到了这个 python 问题;过去一个小时我一直在努力,但我完全陷入困境。我仍然对递归不太满意,而且问题越来越难,所以非常感谢任何类型的帮助!

问题很简单,我需要编写一个函数,将 n 和 w 作为输入;其中 n 是位串的大小,w 是字符串中 1 的个数。输出应该是它的所有排列。

例子:

n = 3, w = 1 : ['001', '010', '100']

n = 4, w = 2: ['0011', '0101', '0110', '1001', '1010', '1100']

这是我到目前为止所写的,但我对其进行了调整或在 python 可视化器中运行它,我就是想不通:

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

再次感谢任何帮助!我真的很想能够解决这个问题

谢谢!!

【问题讨论】:

  • 我正在查看,但我看到的一件事是 Y 中的 m:M.append("1"+s) 应该是 "1"+m?
  • @user2379875 打败我。
  • @user2379875 这确实是一个愚蠢的错误... xD 但它并没有完全解决它:( 非常感谢你看一看 :3

标签: python recursion


【解决方案1】:

您的开场白不允许出现 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']

【讨论】:

  • 你先生,真棒!谢谢!
【解决方案2】:

如果你不介意不使用递归,这里有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']

【讨论】:

  • 这是一个非常酷的方法!不幸的是,我必须使用递归来做到这一点:(我并不介意,过去一个小时考虑这个问题正在帮助我越来越多地理解这个原理
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2021-11-09
  • 2015-11-21
  • 2021-12-15
  • 2023-04-11
  • 1970-01-01
  • 2014-08-10
  • 2015-06-14
相关资源
最近更新 更多