[问题] 新手写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