[問題] 新手寫while迴圈問題

作者: wenyi420 (汶ww)   2018-03-20 17:06:04
第一次在板上發文,希望各位大大多多包函
小弟寫了一個猜數字遊戲,設定可以猜三次,沒猜中詢問是否還要再猜
問題 : 測試時,在未滿三次內猜中時,程式可以結束並回復恭喜猜中
但當次數超過三次後再選擇玩遊戲後,此時猜中會恭喜猜中,但是卻不會跳出循環
會再出現詢問是否再猜數字的問題,並且計算次數會直接變為三次
https://imgur.com/a/osbit
附上程式碼 :
import random
def play_game():
a = [ i for i in range(1,51)] # a = [1~50]
cn =random.choice(a) # 從 a 挑一個值
print(cn) #可看到答案數字
print('歡迎來猜數字')
print('請從1~50輸入一個數字,可猜三次')
num = int(input(''))
count = 1 # 計算次數
while num != cn :
print(count)
if count == 3 :
print('次數已經用完')
yn = input('是否還要再玩一次? (yes/no)')
if 'yes' == yn :
command = play_game()
else:
print('歡迎再來,byebye')
break
elif num > cn:
print('猜小一點')
num = int(input(''))
count += 1
elif num < cn :
print('猜大一點')
num = int(input(''))
count += 1
else :
print('恭喜猜中')
希望前輩們幫我解惑,感謝
作者: AlaRduTP (Eden)   2018-03-20 17:37:00
雖然沒有實際跑過,但我想問題會不會出在:你在迴圈中呼叫新的迴圈(但舊迴圈並沒有結束),當新迴圈結束後會繼續原本的舊迴圈(此時count=3)。試試看在command = play_game()後加break吧這是一種遞迴(的感覺?
作者: Jeffrey11061 (Jeff)   2018-03-20 17:48:00
感覺是in == ‘yes’的地方,裡面放的應該是initialize的內容(例如count=0,a重新抽等等),而不是再呼叫一次自己
作者: handsomeLin (DoGLin)   2018-03-20 18:17:00
的確是第一位講的那樣,你recursive的呼叫自身函數,在很多情況是不推薦的,尤其你這種簡單的函數,最簡單的方式就是直接從while迴圈中break出來 然後詢問是否繼續,或者更簡單的方式就是重新在while迴圈裡讓count=1 然後目標值重新取亂數 更簡單暴力,不過解法很多看個人喜好吧我講的第一種方式一樣是recursion但是最後一層猜中之後 不會卡在while裡 或者原語句下面寫個return也行
作者: wenyi420 (汶ww)   2018-03-20 18:25:00
謝謝指導,已解決了。在command下加break就沒出錯了看來我寫的太亂了哈哈 ,謝h大建議
作者: handsomeLin (DoGLin)   2018-03-20 18:27:00
然後你重複的語句很多 猜大猜小可以用一句解決 新的input跟count+=1重複就拿出來一起用
作者: vfgce (小兵)   2018-03-20 18:32:00
呃,不是在comand底下加個break就沒事,這是個很爛的recursiv一個問題可以用迴圈解決就千萬不要用遞迴,除非問題本身可以用遞迴寫得更簡潔或問題本身就具有recursive性質....
作者: iphone2003 (307)   2018-03-20 19:42:00
好奇問,樓上說的問題本身就有recursive性質是指什麼?像數學上的那種遞迴關係式或是河內塔那種嗎
作者: vfgce (小兵)   2018-03-20 20:15:00
是的,問題本身可分解成解法相同但更小的子問題,且有明確終止條件.即使可寫成recursive,但能用迴圈儘量用迴圈..
作者: Jeffrey11061 (Jeff)   2018-03-21 13:50:00
就是他要達到的功能本質上不該用recursive 的方式實作 儘管已經可以跑了 我猜大概是這個意思吧
作者: handsomeLin (DoGLin)   2018-03-21 18:22:00
是很爛的遞迴沒錯哈哈

Links booklink

Contact Us: admin [ a t ] ucptt.com