簡體   English   中英

遞歸調用中返回的問題

[英]Trouble returning in recursive call

我已經成功完成並通過了我正在上的一門課程的項目,在該課程中,我創建了所有可能的4個字母的密碼組合來破解DES哈希。 當我找到一個匹配項時,它應該立即返回,但是我知道我的函數設計不良。 我了解基本的遞歸,但是出於任何有用的目的,我一直很難理解它。 在這種情況下,我發現使方法返回的唯一方法是檢查在封裝函數中初始化的密碼變量以及nonlocal屬性。

在進入最終解決方案之前,我已經在非本地環境下進行了此工作,但是即使找到時正確打印出了密碼,它也會繼續執行一段時間而不返回任何內容。

如何通過正確傳播值正確使用遞歸來返回正確的密碼? 感謝您提供的任何幫助或提示!

def brute_force_crack(hashed_pass):
    char_list = create_possible_chars()

    # Store all string combinations
    password = ""

    # Build the combos adding each letter to each prefix and then to combos.
    def build_combos(curr_str):

        nonlocal password

        # Check password to return early
        if password != "":
            return
        if len(curr_str) == 4:
            return

        for letter in char_list:
            # Add letter to curr_str to build up the combo
            curr_str += letter

            if is_password(curr_str, hashed_pass):
                password = curr_str
                break

            build_combos(curr_str)
            # Reset curr_str to be used again in this iteration without the added letter
            curr_str = curr_str[:-1]

    build_combos("")
    return password

只要確保找到正確答案,便可以將其返回。 通過函數的每個路徑都應該返回一些信息,或者是正確的密碼,或者是指示失敗的標記值(例如None )。 看看以下對您是否有意義:

import string

def create_possible_chars():
    return string.ascii_lowercase

# Dummy implementation, check for the password reversed
def is_password(curr_str, hashed_pass):
    return ''.join(reversed(curr_str)) == hashed_pass

def brute_force_crack(hashed_pass):
    char_list = create_possible_chars()

    def build_combos(curr_str=""):
        # Base case: already at four characters, give up
        if len(curr_str) == 4:
            return None

        for letter in char_list:
            # Try adding this letter
            guess = curr_str + letter

            if is_password(guess, hashed_pass):
                # If this is the password, return it
                return guess
            else:
                # Recurse
                result = build_combos(guess)

                # If we found the password, return it
                if result is not None:
                    return result

        # We failed to find the psasword
        return None

    return build_combos()

print(brute_force_crack("beef"))  # feeb

您應該旨在讓遞歸函數在找到后返回正確的密碼,而不是設置非局部變量。

其次,在遞歸功能開始時執行密碼檢查,同時檢查是否失敗。 第一次似乎有點過分(因為一個空字符串將不匹配),但這是更簡潔的代碼。

這是它的外觀:

def brute_force_crack(hashed_pass):
    char_list = create_possible_chars()

    # Build the combos adding each letter to each prefix and then to combos.
    def build_combos(curr_str):
        # Check for success
        if is_password(curr_str, hashed_pass):
            # Return the match
            return curr_str
        # Check for failure
        if len(curr_str) >= 4:
            return

        for letter in char_list:
            # Add letter via argument to build up the combo
            password = build_combos(curr_str + letter)
            # If a result is returned, we can quit
            if password:
                return password

    # Return whatever is returned recursively
    return build_combos("")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM