https://www.cnblogs.com/xyqxyq/p/10211341.html
我々は再帰的解決できる問題では、我々は最初にすべての式の、すなわち、3つの部分に分かれていることができます。
(1)式:の項目、プラスまたはマイナス
(2):因子、乗算と除算
(3)要因:()式の数
これら3は、再帰的な関係を構成し、我々は表現の必要な値は、我々は最初の項目の値を求めていることを見ることができ、項目の要求値は、我々は最初の値の係数を求めて、係数の値が必要で、我々そのそれが構成するもので、初見です。
これは、発現させることにより、括弧と組み合わせることができ、また数で構成することができ、数が、我々はこの数のサイズを計算するときことが分かりました。
浮動小数点数は2つの部分に分割され、整数部の大きさを計算するために最初は、10で前に、最後ではなく、それの終わりと、1つを取る場合は、1つを取り、見になり続け、その後、その後、この1を追加します我々はcin.peek()関数は、我々は小数部分を計算するようになりました。この1つがある場合はこの1つは、あるものを見ることができ、および同様の前の、それぞれ10倍にそれを減らします。
>用語 - - >要因、常に再帰的な解決策式が、その後、私たちはそのプロセスを続行する前に、式の場合。
式の評価のために、我々は最初に、後があるかどうかを確認するために、第一項の値を計算し、そう我々は終了していない、計算することができます。時間後に行ったとき、私たちは文字の後ろに食べに行くされているので、再帰た後、我々はそれを片付けるために使用されます。
+使用を終了 - 同じプロセスである、があるかどうかを判断するために、最初のものを求める我々はアイテムを見つけたとき、それを食べたい(後)* /を、次の手順に、一般ケースです。
/ * 再帰的な 四則式が評価さ 百回の訓練を:4132は 何のスペースを入力しない * / 書式#include <iostreamの> の#include <CStringの> の#include <cstdlib> 書式#include <iomanip> // てSetPrecision() 使用して 、名前空間STD; ダブルfactor_value( ); ダブルterm_value(); ダブルexpression_value(); int型のmain() { ダブル ANS = expression_value(); COUT << 修正 <<てSetPrecision(2)ANS << << ENDL; 戻り 0 ; } ダブル expression_value()// 用語追加マイナス { // 有するべきでwhileループ、用語追加マイナス何度 // (A + B + C + D)* B + C + D 二重結果= term_value()。 ブール値より= 真; 一方、(より) { チャー C = cin.peek()。 もし(C == ' + ' || C == ' - ' ) { チャー OP = CIN。取得(); 二重値=term_value(); もし(OP == ' + ' ) 結果 + = 値。 他の 結果 - = 値; } 他 { 複数 = 偽。 } } 戻り値の結果; } ダブル term_value()// 因子/ * { ダブル結果= factor_value()。 しばらく(真)//なぜここwhileループのですか?例:a * b *表C * dの+ a * b *表C { チャー OP = cin.peek()。 もし(OP == ' * ' || OP == ' / ' ) { CIN。取得(); 二重値= factor_value()。 もし(OP == ' * ' ) 結果 * = 値。 他の 結果 / = 値; } 他に ブレーク。 } 戻り値の結果; } ダブルfactor_value() { 二重結果= 0 。 チャー C = cin.peek()。 もし(C == ' (' ) { 。CIN を取得(); 結果 = expression_value(); CIN。得る(); } 他 { 一方(isdigit(c)参照) { 結果 =結果* 10 + C - ' 0 ' ; CIN。 =取得(); Ccin.peek(); } 二重 TMP = 0 。 もし(C == ' ' ) { 二塩基 = 0.1 。 CIN。取得(); チャー CH = cin.peek()。 一方、(isdigit(CH)) { TMP =(CH- ' 0 ')* 基底 + TMP。 塩基 = 0.1 * 基地; CIN。 取得(); CH = cin.peek()。 } } 結果 + = TMP。 } 戻り値の結果; }