[英]How could this function be implemented without recursion?
我正在嘗試做一個賓果游戲,我對此有些掙扎,但最終對其進行了整理。 但是,我的主要“問題”(更像是,我聽說過它的編程錯誤)是使用函數在else語句中調用函數。 我不認為這是您應該采取的方式,盡管我沒有找到任何解決方法。.因為此函數是從另一個稱為menu()的函數調用的,所以當我使用循環時,它將返回菜單如果為假。
這是我的代碼:
def selectingNumbers():
numbers = []
dupl = []
j = 0
print("Now you are gonna select 5 number\n")
while j < 5:
nummer = int(input("Your choice:\n"))
numbers.append(int(nummer))
j = j+1
for i in numbers:
if i not in dupl:
dupl.append(i) #New list without duplicates
if dupl == numbers: #Comparing new list with old list
print("No equal numbers found")
dragning(numbers)
else:
print("Equal numbers found")
selectingNumbers() #Is there a better way to do it?
一開始我的列表也有一些問題,我知道我可以使用set()函數,但是我想保留原始列表,然后將新列表與舊列表進行比較,我可以做得更好嗎? “實際”編程而不是導入模塊的方法?
希望您可以用替代方法回答或指導我這兩個問題,如果可以,請說出我的代碼為什么“不好”。
那么,您必須決定是否要使用遞歸來解決問題。 這行是遞歸調用:
selectingNumbers() #Is there a better way to do it?
很好,並且不等於不良的編程。 但是,函數的其余部分不適合遞歸函數。 您重置變量,因此沒有真正的基本情況。 見谷歌,或在這里的例子。
遞歸對於初學者來說很混亂,因此我將采用一種僅迭代的方法。 這是一個賓果python示例 。
另外,我不確定此行是否有效:
if dupl == numbers: #Comparing new list with old list
我對python不太熟悉 ,但是根據我的經驗,數組被視為對象,因此在這一行中,您將要求python將兩個單獨的對象與內存中的唯一引用進行比較。 因此,即使它們內部的值是相同的,因為它們都是分開引用的,所以它們永遠不會相等。 我找到此鏈接來回答該問題。
遞歸不是“不好的”。 實際上,有時可以極大地簡化問題的解決方案。 但是,對於您的代碼,則沒有必要。 幸運的是,有時可以將其替換為循環。 就您的代碼而言,它似乎可以循環直到它從用戶那里獲得一個不包含任何重復項的列表。 這意味着可以將其重寫,如下所示(我還簡化了其他一些內容):
def selectingNumbers():
while True:
print("Now you are gonna select 5 different numbers\n")
numbers = []
for _ in range(5):
number = int(input("Your choice:\n"))
numbers.append(number)
unique = set(numbers) # will remove any duplicates
if len(unique) == len(numbers): # no dups?
print("No equal numbers found")
break # <--- terminates loop
else:
print("Equal numbers found")
# allow loop to continue
dragning(numbers)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.