式木、二項演算、括弧のネスト処理 のバックアップ差分(No.8)

Unity学習帳2冊目式木、二項演算、括弧のネスト処理 のバックアップ差分(No.8)
« Prev  Next »
7: 2016-07-29 (金) 09:12:30 osinko ソース 8: 2016-08-03 (水) 21:36:13 osinko ソース
Line 323: Line 323:
&ref(tree2.png); &ref(tree2.png);
-この要領で式木を生成すればいい。式木の末端程、計算優先順位は高くなるのでcalculate時は末端から計算する。ではコーディングする+この要領で式木を生成すればいい。式木の末端程、計算優先順位は高くなるのでcalculate時は末端から計算する 
 + 
 +**式木から数式のパターンを眺めてみる [#bafcc66b] 
 + 
 +ここで視点を変えて式木から数式のパターンを眺めてみる。よくある式の一つを眺めてみると以下のような構成となっている(見やすさを優先して横倒しにしています) 
 +&ref(tree3.png); 
 +この①~③の並びを順列と考えて置換すると 
 + 
 +①②③ 
 +①③② 
 +②①③ × 
 +②③① × 
 +③①② 
 +③②① 
 + 
 +の \(3!=3\times 2\times 1=6\) パターンで全てを網羅する事ができる。そこで、この式木を実際に組んで性質をまとめてみる。まず、以下の約束事を定義する 
 + 
 +\(\bullet =\left\{ \times ,\div ,+,- \right\} \\ \overline { \bullet  } =\left\{ \times ,\div  \right\} \\ \underline { \bullet  } =\left\{ +,- \right\} \) 
 + 
 +ここで使用している「\(\bullet \)」マークは匿名の二項結合演算子(この場合①~③)を表している。記号に上線があるものは優先順位の高い演算子の集合「×÷」。下線のあるものは優先順位の低い演算子の「+-」。マークのみは「×÷+-」の集合になっている。このルールに従い式木から数式を見ると以下のような分類が可能となる 
 + 
 +***式木123のパターン [#n73fa719] 
 +\(a①\left( b②\left( c③d \right)  \right) \quad \Leftrightarrow \quad 例:\quad 1\times \left( 2\times \left( 3\times 4 \right)  \right) \quad \\ a\underline { ① } b\overline { ② } \left( c③d \right) \quad \Leftrightarrow \quad 例:\quad 1+2\times \left( 3\times 4 \right) \) 
 +&ref(tree3.png); 
 +***式木132のパターン [#i00c1bc4] 
 +\(a\underline { ① } \left( b②c \right) \overline { ③ } d\quad \Leftrightarrow \quad 例:\quad 1+\left( 2\times 3 \right) \times 4\quad \\ a①\left( \left( b②c \right) ③d \right) \quad \Leftrightarrow \quad 例:\quad 1\times \left( \left( 2+3 \right) +4 \right) \quad \) 
 +&ref(tree4.png); 
 +***式木312のパターン [#m65ca0f9] 
 +\(a\overline { ① } \left( b②c \right) \underline { ③ } d\quad \Leftrightarrow \quad 例:\quad 1\times \left( 2\times 3 \right) +4\quad \\ \left( a①\left( b②c \right)  \right) ③d\quad \Leftrightarrow \quad 例:\quad \left( 1+\left( 2+3 \right)  \right) \times 4\) 
 +&ref(tree5.png); 
 +***式木321のパターン [#c8ed4a45] 
 +\(\left( a①b \right) \overline { ② } c\underline { ③ } d\quad \Leftrightarrow \quad 例:\quad \left( 1\times 2 \right) \times 3+4\quad \\ \left( \left( a①b \right) ②c \right) ③d\quad \Leftrightarrow \quad 例:\quad \left( \left( 1+2 \right) +3 \right) \times 4\) 
 +&ref(tree6.png); 
 +***式木亜種のパターン [#u5b5b75a] 
 +\(\left( a①b \right) ②\left( c③d \right) \quad \Leftrightarrow \quad 例:\quad \left( 1+2 \right) \times \left( 3+4 \right) \\ a\overline { ① } b\underline { ② } \left( c③d \right) \quad \Leftrightarrow \quad 例:\quad 1\times 2+\left( 3\times 4 \right) \\ \left( a①b \right) \underline { ② } c\overline { ③ } d\quad \Leftrightarrow \quad 例:\quad \left( 1\times 2 \right) +3\times 4\) 
 +&ref(tree8.png); 
 +***式木から見て②から始まるパターンは使えない [#wcd465a3] 
 +式木から見て②から始まるパターンはありえない。そのことを以下で確認してみる 
 +&ref(tree7.png); 
 +これは項同士が隣り合っていない、間に邪魔な項があり演算できない。従って式木が成立しない。231のパターンも同様である 
 +***括弧によるネストがない数式を式木として見てみる [#c2efe7cd] 
 +次に括弧によるネストがない数式を式木として見てみると以下のように上記で紹介した各パターンに重複することがわかる 
 + 
 +\(a\overline { ① } b\overline { ② } c\overline { ③ } d\quad \Leftrightarrow \quad a\times b\times c\times d\quad \Leftrightarrow \quad 123のパターン\\ a\underline { ① } b\overline { ② } c\overline { ③ } d\quad \Leftrightarrow \quad a+b\times c\times d\quad \Leftrightarrow \quad 132のパターン\\ a\underline { ① } b\overline { ② } c\underline { ③ } d\quad \Leftrightarrow \quad a+b\times c+d\quad \Leftrightarrow \quad 312のパターン\\ a\overline { ① } b\overline { ② } c\underline { ③ } d\quad \Leftrightarrow \quad a\times b\times c+d\quad \Leftrightarrow \quad 321のパターン\\ a\overline { ① } b\underline { ② } c\underline { ③ } d\quad \Leftrightarrow \quad a\times b+c+d\quad \Leftrightarrow \quad 321のパターン\\ a\underline { ① } b\underline { ② } c\underline { ③ } d\quad \Leftrightarrow \quad a+b+c+d\quad \Leftrightarrow \quad 321のパターン\\ a\underline { ① } b\underline { ② } c\overline { ③ } d\quad \Leftrightarrow \quad a+b+c\times d\quad \Leftrightarrow \quad 亜種のパターン\\ a\overline { ① } b\underline { ② } c\overline { ③ } d\quad \Leftrightarrow \quad a\times b+c\times d\quad \Leftrightarrow \quad 亜種のパターン\) 
 +***結論 [#h0fc7fad] 
 +&font(150%){以上の事から式木の5パターンで3項のあらゆる演算が網羅できることが確認できる&br;}; 
 + 
 +この考えが正しいかどうか。まずブルートフォースの形式で力技で率直にアプローチしたコードと、5パターンにまでシンプル化した式木を利用したコードのふたつで検証を行い、どちらの答えも同一であれば、まず間違いはないだろうとする。では、コーディングを始める
« Prev  Next »


トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom