8: 2016-02-21 (日) 22:51:51 osinko Rewound to 2 ages ago. at 2016-02-21 (日) 22:31:28 |
現: 2016-02-26 (金) 23:46:11 osinko | ||
---|---|---|---|
Line 8: | Line 8: | ||
-関数で考える場合、帰納処理する関数は出力と入力が同じになる。また関数内で自分自身を必ず呼ぶ事になる&br;(初期値を設定して初回に呼ぶコードと、自分自身を呼び続けループ処理するコードの2部分に分けて書く事になりやすい) | -関数で考える場合、帰納処理する関数は出力と入力が同じになる。また関数内で自分自身を必ず呼ぶ事になる&br;(初期値を設定して初回に呼ぶコードと、自分自身を呼び続けループ処理するコードの2部分に分けて書く事になりやすい) | ||
-関数の機能は自分自身を使って自分を定義する構造になる&br;従って&font(Red){生成される出力値、入力値は全て同じ「性質」を持つ事になる};&br;この「同一の性質」を利用して再帰関数の出力値とは別にクラスや構造体を作ったり、データー構造の制御が出来る | -関数の機能は自分自身を使って自分を定義する構造になる&br;従って&font(Red){生成される出力値、入力値は全て同じ「性質」を持つ事になる};&br;この「同一の性質」を利用して再帰関数の出力値とは別にクラスや構造体を作ったり、データー構造の制御が出来る | ||
+ | -&font(Red){以上の事から「出発点、初期値の設定の値」はどんな方法であれ必ず「帰納関数の出力値」と同一の性質を持つ様に作る必要がある}; | ||
-再帰と帰納は方向が違う&br;「小さなものから大きなものへ」という方向に進むのが帰納&br;「大きいものから小さいものへ」という方向に進むのが再帰 | -再帰と帰納は方向が違う&br;「小さなものから大きなものへ」という方向に進むのが帰納&br;「大きいものから小さいものへ」という方向に進むのが再帰 | ||
Line 13: | Line 14: | ||
-&font(Red){はじめに、どれぐらいの大きさになるのか予想が出来ないデーター構造を統一して扱える}; | -&font(Red){はじめに、どれぐらいの大きさになるのか予想が出来ないデーター構造を統一して扱える}; | ||
- | -&font(Red){処理の深さを後から調節できる(まともにやると無限ループに陥るような処理を任意に途中で打ち切れる。あらかじめ深さを決めて置く事も出来る)}; | + | -&font(Red){取り尽くすアルゴリズム。粗いものから細かいものへと精度をあげて行くような計算などが作れる}; |
- | -&font(Red){粗いものから細かいものへと精度をあげて行くような計算やアルゴリズムが作れる}; | + | -&font(Red){処理の深さを調節できる(まともにやると無限ループに陥るような処理を任意に途中で打ち切れる。あらかじめ深さを決めて置く事も出来る)};&br;たとえば前出力と今出力との「差」の度合いを見て途中で打ち切る等 |
AIや数学的解析、物事の判定、判断を行う際に、おそらく必ず必要になる | AIや数学的解析、物事の判定、判断を行う際に、おそらく必ず必要になる | ||
シンプルなアクションゲームでは必要ないがストラテジーやパズルゲームで必要になる | シンプルなアクションゲームでは必要ないがストラテジーやパズルゲームで必要になる | ||
「数学の漸化式」と「C#の帰納関数」は入出力が同一になるという点で非常に相性が良い | 「数学の漸化式」と「C#の帰納関数」は入出力が同一になるという点で非常に相性が良い | ||
- | |||
- | #hr | ||
- | |||
- | |||
- | <漸化式> | ||
- | |等差数列|\({ a }_{ n+1 }-{ a }_{ n }=d\)|\(d=\)公差| | ||
- | |等比数列|\(\frac { { a }_{ n+1 } }{ { a }_{ n } } =r\)|\(r=\)公比| | ||
- | |階差数列|\({ a }_{ n+1 }-{ a }_{ n }=f\left( n \right)\)| | | ||
- | |||
- | 数列の漸化式は帰納的定義となる | ||
- | |||
- | 例えば等差数列の総和の漸化式は以下の形となる | ||
- | <TODO> | ||
- | 等比数列の総和の漸化式は | ||
-帰納は定義にも使える(数列のみならず、帰納的なアルゴリズムによってある一定の形状なり、動き、法則を持った構造物の作成に利用できる)&br;(例:ハノイの塔。自動生成の迷路等) | -帰納は定義にも使える(数列のみならず、帰納的なアルゴリズムによってある一定の形状なり、動き、法則を持った構造物の作成に利用できる)&br;(例:ハノイの塔。自動生成の迷路等) | ||
//-帰納定義は「自分自身を使って自分を定義する」という考え方 | //-帰納定義は「自分自身を使って自分を定義する」という考え方 | ||
- | -帰納によって出力された値は自明な事として全て「同一の性質」を持っていると断言できる | + | -帰納に関わる入出力値は自明な事として全て「同一の性質」を持っていると断言できる |
//-再帰と帰納は方向が違う。「小さなものから大きなものへ」という方向に進むのが帰納。「大きいものから小さいものへ」という方向に進むのが再帰 | //-再帰と帰納は方向が違う。「小さなものから大きなものへ」という方向に進むのが帰納。「大きいものから小さいものへ」という方向に進むのが再帰 | ||
***数学的帰納法による証明 [#h0f4488f] | ***数学的帰納法による証明 [#h0f4488f] | ||
- | 帰納的に定義された対象(つまり数列)は「数学的帰納法による証明」が行える | + | 帰納的に定義された対象は「数学的帰納法による証明」が行える |
+ | 数学的論理による説明は慣れないうちはその主張がシンプル過ぎて意味がわからない | ||
+ | なので論理が主張する意味を追いかけて読み行間から意味を汲み取る必要がある。追いかけて読んでみる | ||
自然数\(n\in\mathbb{N}\) に依存する命題 \(p(n)\) に対して | 自然数\(n\in\mathbb{N}\) に依存する命題 \(p(n)\) に対して | ||
Line 49: | Line 39: | ||
が成り立つ。数学的帰納法が成り立つ最低条件がこれとなっている | が成り立つ。数学的帰納法が成り立つ最低条件がこれとなっている | ||
- | +\(p(1)\) が数列の一番端(1や0)が成り立つ事を示す | + | +数列の初期値(この場合\(n=1\))が関数\(P(1)\)で成り立つ事を示している |
- | +任意の自然数\(k\)に対して\(p(k) ⇒ p(k+1)\)が成り立つ事を示す | + | +任意の自然数\(k\)に対して\(p(k) ⇒ p(k+1)\)が成り立つ事を示す。これは離散的に連続するすべての自然数を入力とした関数が同じ性質を持っている事を示している |
//(\(p(k)\)は仮定。\(p(k+1)\)が証明) | //(\(p(k)\)は仮定。\(p(k+1)\)が証明) | ||
+1.2.が同時に成り立つ事が示せることから任意の自然数\(n\)について\(p(n)\)が成り立つ事を結論づける | +1.2.が同時に成り立つ事が示せることから任意の自然数\(n\)について\(p(n)\)が成り立つ事を結論づける | ||
Line 58: | Line 48: | ||
これは「[[プログラマの数学>書評]]」で説明されるドミノのたとえ話を論理的に説明したもの | これは「[[プログラマの数学>書評]]」で説明されるドミノのたとえ話を論理的に説明したもの | ||
- | &font(Red){C#にこの論理を当てはめると\(p(1)\)は初期設定関数、\(p(k) ⇒ p(k+1)\)はループする帰納関数部を指している。\(p(n)\)が成り立つとは、つまりこの帰納関数で生成される値は、どんな入力値であろうが出力値の「性質は変わらない」事を説明している}; | + | &font(Red){C#にこの論理を当てはめると\(p(1)\)は初期設定関数、\(p(k) ⇒ p(k+1)\)はループする帰納関数部を指している。\(p(n)\)が成り立つと主張する部分では、この帰納関数の全入出力は(自然数\(n\)がどんな値をとっても)関数\(p\)の性質を持ち続ける事を結論付けている。この論理式の前提を満たす関数は「数学的帰納法」に適合したものであると、この論理式は定義付けている}; |
<メモ> | <メモ> | ||
+ | 「ホーン節」という面白い考え方があるらしい。上記の解釈は我流であり本当はこれを理解した上でやるべきなのかもしれない。以下、資料 | ||
+ | [[ホーン節:https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%BC%E3%83%B3%E7%AF%80]] | ||
+ | [[9.5 ホーン節と導出原理:http://www.ipc.hokusei.ac.jp/~z00102/SeminarII/2000/Lecture24/Horn.htm]] | ||
+ | [[論理プログラミング:https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0]] | ||
+ | ちょっと理解が出来ていないが一度しっかりやってみる必要があるかもしれない… | ||
+ | |||
εδ論法はεとδが対応する関係にあった | εδ論法はεとδが対応する関係にあった | ||
この命題も対応する関係を含意によって証明(裏に隠れた関数が同じものだという事を証明)している訳だからよく似た事をしている? | この命題も対応する関係を含意によって証明(裏に隠れた関数が同じものだという事を証明)している訳だからよく似た事をしている? | ||
Line 77: | Line 73: | ||
***証明の例 [#uf20558d] | ***証明の例 [#uf20558d] | ||
以下の漸化式が奇数になる事を証明する | 以下の漸化式が奇数になる事を証明する | ||
- | \(\begin{cases} { a }_{ n }=3 \\ { a }_{ n+1 }=2{ a }_{ n }-1 \end{cases}\) | + | \(\begin{cases} { a }_{ 1 }=3 \\ { a }_{ n+1 }=2{ a }_{ n }-1 \end{cases}\) |
規則P: どの\({a}_{n}\)も\(2\)で割ると\(1\)余る(奇数になる) | 規則P: どの\({a}_{n}\)も\(2\)で割ると\(1\)余る(奇数になる) | ||
Line 103: | Line 99: | ||
重要なのは再帰的なプログラムコードや関数も、これを意識すると非常に性質を制御しやすく作りやすくなるという点 | 重要なのは再帰的なプログラムコードや関数も、これを意識すると非常に性質を制御しやすく作りやすくなるという点 | ||
+ | |||
+ | ***バックアップストッカー [#jaa1e2ee] | ||
+ | |||
+ | <漸化式> | ||
+ | |等差数列|\({ a }_{ n+1 }-{ a }_{ n }=d\)|\(d=\)公差| | ||
+ | |等比数列|\(\frac { { a }_{ n+1 } }{ { a }_{ n } } =r\)|\(r=\)公比| | ||
+ | |階差数列|\({ a }_{ n+1 }-{ a }_{ n }=f\left( n \right)\)| | | ||
+ | |||
+ | 数列の漸化式は帰納的定義となる | ||
+ | |||
+ | 例えば等差数列の総和の漸化式は以下の形となる | ||
+ | <TODO> | ||
+ | 等比数列の総和の漸化式は |