2017-08-19 125 views
2

我正在試圖實現一個用於平衡給定數學方程式的括號作爲字符串的函數。它應該改變字符串,而不僅僅是檢查它是否平衡。用於平衡括號的函數

因爲數學方程可以包含三角函數,所以我想在這樣的函數後面添加radians(),因爲在Python中,三角函數將輸入看作弧度,而我需要度數。因此tan(65)變成tan(radians(65))
cos(65) + sin(35)成爲cos(radians(65)) + sin(radians(35))
cos((30 - 10) * 2)成爲cos(radians((30 - 10) * 2))

到目前爲止,我所使用replace()完成與sin(radians(更換cos(cos(radians(sin(,同樣的事情也適用於所有的休息三角函數。但問題是,字符串(這是一個數學方程)變成了括號 - 不平衡。

如何編寫函數來解決這個問題?

回答

1

下面是在適當位置插入radians(並保持括號平衡的算法的概要。如果事先確實使括號平衡,並且在字符串文字中沒有不平衡的括號(如len("abc(d")),這將起作用。但是,這看起來並不太合理。

不只是使用replace()。而應使用find()來查找cos(或其他trig函數的用法。將計數器設置爲零。然後在右括號[(cos(]之後立即掃描字符串。當你遇到左括號時,將計數器加1;當你遇到右括號時,將計數器減1。當你的計數器達到-1時,你已經發現你的trig函數的右括號。在該位置插入新的右括號,然後在trig函數後面插入您的radians(

繼續此操作,直到處理完字符串中的所有trig函數。

+0

這種方法存在一個問題:'cos(0)'是有效的,但沒有被檢測到('cos'和'(')之間有一個空格,可能需要一個正則表達式。 – jp48

+0

@ jp48:我想過但是OP沒有在他嘗試的算法中考慮這種可能性,我假設這個字符串已經以某種方式預處理以消除這種可能性,或者他正在用cos(弧度)或者其他的。也許我應該在我的答案中包含這些細節,但是我決定放棄這些細節並將我的答案稱爲「算法的概要」。我正在努力在答案中提供適當的細節,並且有時會出現超調或欠調 –

+0

@ jp48:我對正則表達式有一點了解,並且我不知道如何找到函數和它的成對的右括號,怎麼做呢?這將是值得一個完整的答案。 –

2

您可以cosdeg替代cos和定義:

def cosdeg(x): 
    return cos(radians(x)) 

或(拉姆達版):

cosdeg = lambda x : cos(radians(x)) 

而且在與其他三角函數類似的方式。

+0

我喜歡這個答案,因爲它顯示了比OP已經認爲理所當然的解決方案更好的方式。 – trincot

+0

非常好的答案。但是,在我的程序中,輸入由'eval()'函數評估。爲了時間和用戶友好性,我無法定義一個新功能。 –