如何生成设定长度的所有可能的二进制序列——给定序列的设定部分

问题描述 投票:0回答:1

这最初只是练习一些 Python 编程的简单练习,但我一直无法修复我的逻辑缺陷!

目标很简单。给定一个预定大小的数组,我需要构建该数组大小的所有可能的二进制排列。另一个复杂之处是特定的数组索引已经设置,从而避免了生成多个排列的需要。

举个具体例子:

n=3
arr = [None]*n
arr[0] = 0

二进制排列的结果列表应该是:

[0, 0, 0],[0, 0, 1],[0, 1, 0],[0, 1, 1]

我的代码正在返回:

[0, 0, 0],[0, 0, 1],[0, 1, 1]

所以我可以清楚地看到在哪一点它没有创建进一步的排列(因为这个问题只会随着更大的数组大小而加剧)。不幸的是,我不明白为什么它没有生成最后一个排列。

这是我用来生成和打印二进制字符串的代码:

def arrayPrint(arr, n):  
  
    for i in range(0, n):  
        print(arr[i], end=" ")  
      
    print() 

def binaryStringGen(n, arr, i): 

    if i == n: 
        arrayPrint(arr, n) 
        return
    
    if (arr[i] == None):
        arr[i] = 0
        binaryStringGen(n, arr, i + 1) 

        arr[i] = 1
        binaryStringGen(n, arr, i + 1)
    else:
        binaryStringGen(n, arr, i + 1) 

任何有助于理解这一点的帮助将不胜感激!

  - LDAP: 
      pre: mkdir -p <%= @settings["rootDir"] %>/loot/ldap-domaindump <%= @settings["rootDir"] %>/scans/ldap 
      panes:
        - ldapdomaindump:
          - tmux select-pane -T 'ldapdomaindump' -t "authd:LDAP.0"
          - mkdir -p <%= @settings["rootDir"] %>/loot/ldap-domaindump && cd <%= @settings["rootDir"] %>/loot/ldap-domaindump
          - ldapdomaindump -u '<%= @settings["domain"] %>\<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1)
        - getADusers:
          - tmux select-pane -T 'getADusers' -t "authd:LDAP.1"
          - GetADUsers.py -all '<%= @settings["domain"] %>/<%= @settings["user"] %>:<%= @settings["pass"] %>' -dc-ip $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1) | tee <%= @settings["rootDir"] %>/scans/ldap/getADUsers.txt
        - ldap signing:
          - tmux select-pane -T 'ldap signing' -t "authd:LDAP.2"
          - cd <%= @settings["toolDir"] %>/LdapRelayScan || git clone https://github.com/zyn3rgy/LdapRelayScan.git <%= @settings["toolDir"] %>/LdapRelayScan && cd <%= @settings["toolDir"] %>/LdapRelayScan && echo "git+https://github.com/wbond/oscrypto.git@d5f3437" >> requirements.txt; pipenv run pip install -r requirements.txt --force-reinstall && mkdir -p <%= @settings["rootDir"] %>/scans/ldap && cd <%= @settings["toolDir"] %>/LdapRelayScan && pipenv install --skip-lock && cd <%= @settings["toolDir"] %>/LdapRelayScan; clear
          - pipenv run python3 LdapRelayScan.py -method BOTH -dc-ip $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1) -u '<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' | tee <%= @settings["rootDir"] %>/scans/ldap/ldapSigning.txt
        - get user descriptions:
          - tmux select-pane -T 'get user descriptions' -t "authd:LDAP.3"
          - crackmapexec ldap <%= @settings["rootDir"] %>/dcIP.txt -u '<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' -d <%= @settings["domain"] %> -M get-desc-users | tee <%= @settings["rootDir"] %>/scans/ldap/userDescriptions.txt
arrays python-3.x binary
1个回答
0
投票

您必须在 else 分支之前添加

arr[i] = None

    if (arr[i] == None):
        arr[i] = 0
        binaryStringGen(n, arr, i + 1) 

        arr[i] = 1
        binaryStringGen(n, arr, i + 1)
        arr[i] = None  #  <= add this

否则,当你从

binaryStringGen
回溯并稍后使用相同的
binaryStringGen
值再次调用
i
时,
arr[i]
仍将被设置为 1,并且你的代码将进入 else 分支。

更一般地,当您编写对参数有副作用的递归函数时,请确保在函数终止后正确设置这些函数。

© www.soinside.com 2019 - 2024. All rights reserved.