我正在學習的演算法課程的一部分是使用查找鍵和值的字典并繼續查找匹配的鍵和值。例如,如果有匹配的鍵,則使用該值查找下一個鍵并繼續沿著兔子洞向下走。如果多次找到匹配項以防止無限回圈,則回傳 False 否則它應該回傳找到的最后一個鍵。
- 查找一個名為“bat”的鍵,找到一個值“pig”然后繼續
- 查找一個名為“pig”的鍵,找到“cat”然后繼續
- 查找一個名為“cat”的鍵,找到“dog”然后繼續
- 查找一個名為“dog”的鍵,找到“ant”然后繼續
- 查找一個名為“ant”的鍵,沒有找到關聯的值,所以它會回傳“ant”
這是資料:
d = {'bat': 'pig', 'pig': 'cat', 'cat': 'dog', 'dog': 'ant', 'cow': 'bee', 'bee': 'elk', 'elk': 'fly', 'ewe': 'cod', 'cod': 'hen', 'hog': 'fox', 'fox': 'jay', 'jay': 'doe', 'rat': 'ram', 'ram': 'rat'}
這是我下面的函式,我正在嘗試學習遞回......并理解為什么return False當保存到的鍵MEMORY的值大于 2 時我的函式不起作用。
def rabbit_hole(dictionry,key,MEMORY={}):
#print(MEMORY)
if key in MEMORY:
MEMORY[key] = 1
else:
MEMORY[key] = 1
for val in MEMORY.values():
#print(val)
if val == 2:
return False # <--- why not working?
for k,v in dictionry.items():
if k == key:
# recursive call
rabbit_hole(dictionry,v,MEMORY)
#print("return last added dict key")
return list(MEMORY)[-1]
任何提示在這里都不是很多智慧......如果我運行:
print(rabbit_hole(d, "bat"))
print(rabbit_hole(d, "ewe"))
print(rabbit_hole(d, "jay"))
print(rabbit_hole(d, "yak"))
print(rabbit_hole(d, "rat"))
上面的代碼回傳:
ant
hen
doe
yak
ram
但它應該False像rat這樣回傳:
ant
hen
doe
yak
False
uj5u.com熱心網友回復:
你很接近,這一點可以幫助你:
您跳出遞回回圈的條件通常應該首先出現,即如果密鑰在 MEMORY 中
您需要回傳遞回呼叫的值,謝謝 Abhinav
另外,一些樣式/優化建議:
如果您想跟蹤到目前為止所看到的內容,可以使用 a
setover adict然后使用字典,您不需要遍歷鍵(這會破壞字典的要點)。您可以只查看一個鍵是否在字典中,如果是,則獲取該值。
將默認的可變引數替換為
dictNone,如果傳入為 None,則將其設定為字典(或集合)。這是因為如果您重新運行該函式:
print(rabbit_hole(d, "bat"))
print(rabbit_hole(d, "bat"))
它將重用相同的字典/集,然后將具有預先存在的鍵,而不是創建一個新字典
ant
False
我建議您再試一次這些要點,但如果不是,這里有一個解決方案:
def rabbit_hole(dictionary, key, seen=None): if seen is None: seen = set() if key in seen: return False seen.add(key) if key in dictionary: return rabbit_hole(dictionary, dictionary[key], seen) return key
uj5u.com熱心網友回復:
主要問題是,您沒有從遞回呼叫中回傳值。結果,該函式回傳記憶體串列中的最后一個值。這個簡單的修復應該回傳正確的值:
for k,v in dictionry.items():
if k == key:
# recursive call
return rabbit_hole(dictionry,v,MEMORY)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507821.html
