目前在練習四則運算,我想自己寫判斷,不使用eval()來操作,
我的解題想法是把運算式子用陣列表達,最後會是多層陣列。
x="2*9*3+5*8/2+60*10/5/1"
#經過我的split之後會變成以下:
x=[[['2'], ['9'], '3'], [['5'], ['8', '2']], [['60'], ['10', '5', '1']]]
#我是先分割加減,然後才是乘法,最後是除法
接下來我就知道answer=x[0]+x[1]+x[2],因為第一次分割是加法。
所以要處理這三項,而每一項裡面的值是相乘:
x[0]=x[0][0]*x[0][1]*x[0][2]
x[1]=x[1][0]*x[1][1]
以此類推
最後要處理除法就會像是這樣
x[2][1]=x[2][1][0]/x[2][1][1]/x[2][1][2]
思考方向講完了,接下來是操作,我試圖用一個函式去丟出某陣列的所有項,
但我不知道該如何把所有項拿來運作乘除。
def AllofArr(test):
for i in range(len(test)):
if type(test[i])==list:
return AllofArr(test[i])
print(test[i],end="")#這裡我只能把項都丟出來 實際上我想要讓他們運算
後來我想到物件導向與類別之類的觀念,試圖建立一個class
class Book:
def __init__(self,one,two,three,long):
self.one=one
self.two=two
self.three=three
self.long=long
#我想讓某陣列裡面的所有值存起來,目前先操作三項而已
def SaveValue(A):
if len(A)==3:
s=Book(A[0],A[1],A[2],3)
if len(A)==2:
s=Book(A[0],A[1],'null',2)
if len(A)==1:
s=Book(A[0],'null','null',1)
return s
#這個是想要call出某一項的值的函式
def One(A):
q=SaveValue(A).one
return q
def Two(A):
q=SaveValue(A).two
return q
def SaveValue(A):
q=SaveValue(A).three
return q
目前寫到這邊,整體好像已經到一個極限了,不知道該如何操作下去。
我希望能依照我的最初思路去解,
似乎還差遞迴或是一個漂亮的迴圈,因為我知道我這種想法勢必會面對以下的code:
One(One(Three(One(x))))
One(One(One(x)))
Two(Two(One(x)))
One(Three(One(x)))
這種東西……
對於這題,我有看到有人提出DFS與BFS的演算法,我想知道跟我的作法是否有類似?
稍微去看了教學影片,感覺是很棒的東西,
但在自己的code中不太知道如何運用。
想問如果要用我這種處理陣列的方式解題,該怎麼把它寫完?
x="2*9*3+5*8/2+60*10/5/1"
def tolist(str):
list01=str.split('+')
print(list01)
list02=[]
for v01 in list01:
if v01.find('*')>0:
list02.append(v01.split('*'))
else:
list02.append(v01)
print(list02)
list03 = []
for v02 in list02:
list04=[]
for v01 in v02:
if v01.find('/') > 0:
list04.append(v01.split('/'))
else:
list04.append(v01)
list03.append(list04)
return list03
a=tolist(x)
#a=[['2', '9', '3'], ['5', ['8', '2']], ['60', ['10', '5', '1']]]
print(a)
class Book2:
tag_str=["add","multiply","divide","null"]
def __init__(self, t_list,t_tag="add"):
self.m_list=t_list
self.tag=t_tag
def getNum(self,num):
if num >= self.len:
print("error01")
return null
return Book2(self.m_list[num])
def len(self):
return len(self.m_list)
def value(self):
if self.tag == "add":
return self._add()
if self.tag == "multiply":
return self._multiply()
if self.tag == "null":
return 0
return 0
def _add(self):
t_value=0
for num in self.m_list :
#print("add")
#print(num)
if isinstance(num, list):
t_value = t_value + Book2(num,self.getNextTag()).value()
else:
t_value = t_value + int(num)
return t_value
def _multiply(self):
t_value=1
for num in self.m_list :
#print("multiply")
#print(num)
if isinstance(num, list):
t_value = t_value* Book2(num,self.getNextTag()).value()
else:
t_value = t_value* int(num)
return t_value
def getNextTag(self):
if not(self.tag in self.tag_str):
print("error")
print(self.tag)
return self.tag_str(len(self.tag_str)-1)
if self.tag == "null" :
print("error")
return self.tag
v=self.tag_str.index(self.tag)
return self.tag_str[v+1]
print(Book2(a).value())
你的分割跟我的不太一樣
運算只做了加 乘
我是覺得用不到 物件導向/DFS/BFS 啦
x="2*9*3+5*8/2+60*10/5/1"
#經過我的split之後會變成以下:
x=[[['2'], ['9'], '3'], [['5'], ['8', '2']], [['60'], ['10', '5', '1']]]
#我是先分割加減,然後才是乘法,最後是除法
只要在你的 split (eg.產生陣列)時,加上一個「運算子」即可
類似像這樣x=[[['2'], ['9'], '3', '*'], [['5'], ['8', '2', '/'], '*'], [['60'], ['10', '5', '1', '/'], '*'], '+']
你的算式 sample 都還沒用到小括號呢,就已經寫到這麼複雜了 ....
這個若只是單純切割運算式,放到陣列裡,是沒辦法應付小括號的。要是再巢狀小括號,你就瘋掉了。
思維應該是:
或者使用遞迴(也有堆疊的概念),不過還是得先 parse 算式,正確的拆解算式中的運算優先權,才是正解。