我將編寫一個計算給定函數的零的程序。我決定寫一個解析器來解析這個函數(我從來沒有寫過)。它是一個真實變量的實值函數,如"sin(1/x)+exp(x)"
。我想使用像Bisection和Newton這樣的查找方法。由於這些方法是迭代的,因此我希望避免每次在每個點的循環中評估函數x
。因此,在我努力編寫我自己的解析器之前,我想知道是否可以僅解析一次,並在點x0, x2, ..., xn
處評估函數f
,而不必爲每個x
重新解析f
?如何解析一次數學函數並多次使用其結果
回答
有兩種標準的方法解決這個問題:
解析公式爲所謂的「抽象語法樹」(AST)。這是一個表示公式結構的編譯器數據結構,它可以通過代碼快速檢查。也可以相對快速地評估AST作爲公式。見我蘇答案 建設支持上述任務的遞歸下降解析器: Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
不知何故編譯公式到您的編程語言。這通常涉及到首先構建AST,然後將AST翻譯成編程語言術語,在該結果上運行編譯器,然後加載編譯結果。由於沒有動態鏈接,因此編譯語言(如C)可能會很笨拙;使用Java或C#等語言更容易,因爲它們可以鼓勵動態加載。你可以猜到,這種方法更加努力,但是回報是公式現在可以像你的編程語言一樣快地被評估。您可以通過特設(例如,遞歸下降)的解析和翻譯做到這一點,或者你使用「重寫」一個語法到另一種工具以更正規的方式解決這個:https://softwarerecs.stackexchange.com/a/31379/101
我不能得到第二部分,你的意思是把函數解析成Java代碼,把它放到一個類中,保存爲'.java'文件,編譯並加載它? – Dante
是的..挑剔,你不「解析功能到Java代碼」。您解析公式來構建代表它所說的數據結構(AST)。然後,您將構建一個小型翻譯器,用於遍歷這些數據結構併發出Java代碼。 (或C,或任何你的編程語言)。 –
也許你可以使用Java腳本支持來做到這一點。例如,應該可以在Javascript(Nashorn)中評估函數。
Pro:你不需要自己解析函數。只需提供腳本API。
由於艾拉有已經指出,您將您的表達式解析爲抽象語法樹。抽象語法樹適合您將類似於此:
interface AstNode {
double eval(double x);
}
class ConstantNode implements AstNode {
double value;
double eval(double x) {
return value;
}
}
class VariableNode implements AstNode {
double eval(double x) {
return x;
}
}
class OperatorNode implements AstNode {
char op;
AstNode left;
AstNode right;
double eval(double x) {
switch (op) {
case '+': return left.eval(x) + right.eval(x);
case '-': return left.eval(x) - right.eval(x);
case '/': return left.eval(x)/right.eval(x);
case '*': return left.eval(x) * right.eval(x);
case '^': return Math.pow(left.eval(x), right.eval(x));
default:
throw new RuntimeException("Invalid op " + op);
}
}
}
class Function implements AstNode {
...
你解析樹你的表情後,你可以叫eval()
你感興趣的值
- 1. 多次解析XML文件並將結果合併在一起
- 2. 如何使用AJAX加載文件一次並多次使用其數據?
- 3. 多次調用函數並獲得結果列表
- 4. 如何多次調用一個函數?
- 5. 如何多次使用WITH結果表?
- 6. php函數多次使用
- 7. 使用jQuery(函數($)多次
- 8. 在最終結果上多次使用union,並將其清除
- 9. 調用函數並多次調用
- 10. 如何使用jquery多次調用api並將結果收集到數組中?
- 11. 如果結果不止一次使用
- 12. mouse_event函數一次使用
- 13. 多次並行調用函數
- 14. SQL:重複一個結果行多次,並且數行
- 15. Visual Basic多個函數一次函數
- 16. 如何在LESS中一次生成一個隨機數並使用多次
- 17. R:多次複製一個循環或函數並將結果添加到數據幀中每次
- 18. 如何多次調用函數? (在setInterval())
- 19. 如何多次限制函數調用
- 20. 如何多次調用函數?
- 21. 如何多次調用locationManager.requestWhenInUseAuthorization函數? Cordova
- 22. 析構函數被多次調用並且不合適
- 23. jQuery函數只能使用一次,但我需要多次
- 24. 如何一次返回一行grep結果以便在另一個腳本中使用解析的數據?
- 25. 只有函數執行一次,即使定時器多次調用函數
- 26. 閱讀文件一次,並多次使用數據
- 27. Java - 將數據加載到內存一次,並多次使用
- 28. 爆炸函數返回結果兩次
- 29. 如何防止javascript中的ajax函數一次執行多次
- 30. 解析數組[如何防止用戶投票多次]
你可以存儲地圖。其中'x'映射到'f(x)'。 – vikingsteve