[英]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.