前言
女朋友一個編程小白,最近在學python,從零開始,作為男朋友的我當然不能坐視不管,幫助完成一下她的作業,順便記錄一下,我自己的python也是邊學邊用,基礎很不扎實,就當是自己復習python,把握一些細節,
題目:
用python撰寫24點小游戲,
要求:用鍵盤輸入四個數字,每個在1-10(包含)之間,判斷是否可以通過±*/運算得到24,并輸出運算程序,結果越簡潔越好,

思路
只有四個數字,最簡單粗暴的方法就是列舉法,
1.列出四個數字所有可能的排列組合,(數字可能重復,所以要去重)
2.四個數字運算需要三個符號,所以要列出+-*/四個符號長度為三的笛卡爾積,
3.除了符號還要考慮計算程序中的括號,已經列出了所有數字和符號的組合,括號就只有((a*b)c)d 和(ab)(cd)兩種計算方式,
4.將上述所有可能組合,記錄結果為24的組合就是答案,
實作代碼
print("請輸入四個數字(1-10):")
n1 = input()
n2 = input()
n3 = input()
n4 = input()
four_numbers = [n1,n2,n3,n4]
import itertools
#四個數字的全排列
permutation = itertools.permutations(four_numbers, len(four_numbers))
# for p in permutation :
# print(p)
#因為允許重復數字,所以需要對全排列去重
four_num_list =[]
for i in set(permutation):
four_num_list.append(list(i))
operators=['+','-','*','/']
#四個符號 長度為三的笛卡爾積排列
product = itertools.product(operators,repeat=3)
three_op_list=[]
for i in product:
three_op_list.append(list(i))
expression_list = []
for i in four_num_list:
for j in three_op_list:
expression1 = str('(('+i[0]) + j[0] + str(i[1])+')' + j[1] + str(i[2])+')' + j[2] + str(i[3]) #將各個數都轉化為str型別
#eval可以直接計算出數學運算式的值
result = eval(expression1)
if result ==24:
expression_list.append(expression1+'=24')
else:
expression2 = '(' + str(i[0]) + j[0] + str(i[1]) + ')' + j[1]+'(' + str(i[2]) + j[2] + str(i[3]+')')
result = eval(expression2)
if result ==24:
expression_list.append(expression2+'=24')
for ex in expression_list:
print(ex)
內置方法講解
上面的代碼偷了一些懶,直接用了一些內置函式:
eval():用來執行一個字串運算式,并回傳運算式的值,
itertools是用于創建回圈用迭代器的函式模塊,
itertools.permutations(p,r):創建一個迭代器,所有長度為r的專案序列,如果省略了r,那么序列的長度與p中的專案數量相同: 回傳p中任意取r個元素做排列的元組的迭代器,
本文的題目中沒有限制輸入數字的不可重復,而全排列是對于所有不同位置的元素排列,并不關心元素本身含義,所以全排列會出現相同的數字序列,例如(1,1,2)的全排列如下,此時相同計算程序會重復出現,所以需要去重,
(1, 1, 2)
(1, 2, 1)
(1, 1, 2)
(1, 2, 1)
(2, 1, 1)
(2, 1, 1)
(另外需要注意如果是可以輸入零,則需要注意處理分母為零的情況)
itertools.product(*iterables[, repeat]):以元組的形式,根據輸入的可遍歷物件生成笛卡爾積,與嵌套的for回圈類似,其輸出也是回傳一個迭代器,
repeat是一個關鍵字引數,指定重復生成序列的次數,
用法:
- product(A, B) 和 ((x,y) for x in A for y in B)的效果是一樣的,
- product(A,repeat=3)等價于product(A,A,A)
本文里的笛卡爾積直觀的看效果如下:
('+', '+', '+')
('+', '+', '-')
('+', '+', '*')
('+', '+', '/')
('+', '-', '+')
('+', '-', '-')
('+', '-', '*')
('+', '-', '/')
('+', '*', '+')
('+', '*', '-')
('+', '*', '*')
('+', '*', '/')
('+', '/', '+')
('+', '/', '-')
('+', '/', '*')
('+', '/', '/')
('-', '+', '+')
('-', '+', '-')
('-', '+', '*')
('-', '+', '/')
('-', '-', '+')
('-', '-', '-')
('-', '-', '*')
('-', '-', '/')
('-', '*', '+')
('-', '*', '-')
('-', '*', '*')
('-', '*', '/')
('-', '/', '+')
('-', '/', '-')
('-', '/', '*')
('-', '/', '/')
('*', '+', '+')
('*', '+', '-')
('*', '+', '*')
('*', '+', '/')
('*', '-', '+')
('*', '-', '-')
('*', '-', '*')
('*', '-', '/')
('*', '*', '+')
('*', '*', '-')
('*', '*', '*')
('*', '*', '/')
('*', '/', '+')
('*', '/', '-')
('*', '/', '*')
('*', '/', '/')
('/', '+', '+')
('/', '+', '-')
('/', '+', '*')
('/', '+', '/')
('/', '-', '+')
('/', '-', '-')
('/', '-', '*')
('/', '-', '/')
('/', '*', '+')
('/', '*', '-')
('/', '*', '*')
('/', '*', '/')
('/', '/', '+')
('/', '/', '-')
('/', '/', '*')
('/', '/', '/')
以上的函式可以通過手動回圈和樹結構代替,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/175252.html
標籤:其他
上一篇:事關微信支付,別成為背鍋俠!
