[過去ログ] 関数型プログラミング言語Haskell Part32 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
14
(1): 2019/02/03(日)21:08 ID:RwDwNYzW(1/27) AAS
>>13
>>11 が説明してくれたとおりなのだけど、納得できない?
20
(2): 2019/02/03(日)21:20 ID:RwDwNYzW(2/27) AAS
>>15

ほとんど同じ説明だが…

関数の定義が
fact 0 = 1
fact n = n * fact(n - 1)
となっている。
このとき、左辺が右辺に置き換えられる (簡約という)

つまり fact 3 は 3 * fact 2 に置き換えられる
そして fact 2 は 2 * fact 1 に置き換えられる
そして fact 1 は 1 * fact 0 に置き換えられる
省9
28
(1): 2019/02/03(日)21:29 ID:RwDwNYzW(3/27) AAS
>>23

>>>20
>だからfact(1)で無限に続いちゃうよね
>1 - 1で fact 0をevalしてまたfact(1)になる
>そこで終了条件が必要だけど何にも書いてないから記述通りならずーっと続く

そうはならない

fact 1 = 1 * fact 0
に簡約される

そして
fact 0 = 1 であって
省2
29
(2): 2019/02/03(日)21:30 ID:RwDwNYzW(4/27) AAS
>>25
そうそう。そのとおり。
35
(1): 2019/02/03(日)21:35 ID:RwDwNYzW(5/27) AAS
>>33
>いやいやfact(1)の評価は0なんだし

違う
どこにそんなことが書かれている?
39
(1): 2019/02/03(日)21:37 ID:RwDwNYzW(6/27) AAS
>>34

えーと、すまん、「どんな場合でも」再帰は1を返したら終了すると考えているのなら
それは大間違いだ
41
(1): 2019/02/03(日)21:39 ID:RwDwNYzW(7/27) AAS
>>23
>>>19
>理解したのは>>9の通りで
>仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる

この推測が間違っているので、いったん忘れて素直にプログラムを読んでみよう
43: 2019/02/03(日)21:41 ID:RwDwNYzW(8/27) AAS
>>42

>>29>>31 でお墨付きを与えたのが間違いだった
君はまだ理解できていない (断言)
45
(1): 2019/02/03(日)21:43 ID:RwDwNYzW(9/27) AAS
>>44
忘れろ
忘れてプログラムを読み直しな
48
(1): 2019/02/03(日)21:44 ID:RwDwNYzW(10/27) AAS
もういちど繰り返すが、
>>41 に書いたように
「仮定として1かtrueを返したら再帰は止まる仕様になってると推測している」
が大間違いだ
57
(3): 2019/02/03(日)21:53 ID:RwDwNYzW(11/27) AAS
もしかすると、だけど

fact 0 = 1
を実行した直後に
fact 1 = 1 * fact 0
が続くと考えている?

もうしそうだとしたらそこが間違いで
fact 0 = 1
fact n = n * fact(n - 1)
はそのどちらかしか実行されない
63
(1): 2019/02/03(日)22:00 ID:RwDwNYzW(12/27) AAS
>>60
ああ、良かった

>fact 0 = 1の結果はすぐ反映されるんじゃないの?
そうだよ。そして fact 0 は 1 を返すから、もう再帰呼出しは起こらないよね?

fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
= 6
68: 2019/02/03(日)22:08 ID:RwDwNYzW(13/27) AAS
>どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ

fact 1 = 1 * fact (1-1) = 1 * fact 0

となるけど、これは fact 1 の時の処理だね

fact 0 の場合は 1 を返すだけだから、fact(1-1) という処理はもう出てこないよ

今の話は
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
省6
76
(1): 2019/02/03(日)22:19 ID:RwDwNYzW(14/27) AAS
>>73
fact 0 = 1
で「終了する」というのが間違い

fact 0 = 1
では、fact 0 が 1を返す(正確に言うと1に簡約する)
ということしか定義していない
ただ、もうfact関数を呼び出していないので、再帰呼出しはここで止まる

そして fact 0 = 1 がマクロ定義ということも勘違いなので忘れよう

>>67 が解説してくれた
fact 3
省5
78
(1): 2019/02/03(日)22:22 ID:RwDwNYzW(15/27) AAS
>>75
上に書いたけど、漸化式は理解している?
同じ書き方をします

Haskellは数学を基盤としているので、数学的な記述方法でプログラムが書けます
「再帰から脱出するならそのためのコードは絶対必要なはずなんだ」とあるけど、
もう書かれているよ
fact 0 = 1 って
80: 2019/02/03(日)22:25 ID:RwDwNYzW(16/27) AAS
>fact 0は1なんだからその次はfact(1)になるでしょ
その次はもうないよ
83
(1): 2019/02/03(日)22:28 ID:RwDwNYzW(17/27) AAS
>>81
君の言い方に合わせると「終了条件」と考えてよい

正しく説明すると
>>40 になる
91
(1): 2019/02/03(日)22:34 ID:RwDwNYzW(18/27) AAS
うーん、C言語だと

int fact(int n)
{
if (n == 0) return 1;
else return n * fact (n - 1);
}

と書くのと同じなんだけどねえ
94
(1): 2019/02/03(日)22:39 ID:RwDwNYzW(19/27) AAS
>>92

この1行目はどこから出てきたの?
=3 * 2 * 1 * 1 * fact(1-1)

この辺を脳内でテキトーに処理してるからわからないんだよ
fact 3
のところから地道に書きながら置き換えてみな
97
(1): 2019/02/03(日)22:42 ID:RwDwNYzW(20/27) AAS
>>95
そうなのか。C言語はやったことがあるようだけど
>>91 は理解できてる?
99
(1): 2019/02/03(日)22:43 ID:RwDwNYzW(21/27) AAS
>>95
ああ、>>9 みたいに一気に展開するのではなくて、
fact 3 =
のところからひとつずつ地道に置き換えてみた?
もしやってないなら、今すぐやってみよう
100: 2019/02/03(日)22:44 ID:RwDwNYzW(22/27) AAS
>>98
どうでもよくないから君は間違っている
116: 2019/02/03(日)22:59 ID:RwDwNYzW(23/27) AAS
>>114
>直前の結果が1なので

ここはOK

>fact(n-1)に与えられてfact(1-1)

ここが間違い。与えられるfact(n-1)がもう存在しない
120
(1): 2019/02/03(日)23:03 ID:RwDwNYzW(24/27) AAS
理解できたようで良かったけど、結局は
>>57 がわかってなかったということだなあ
124: 2019/02/03(日)23:04 ID:RwDwNYzW(25/27) AAS
>>121
普通に数学の手法なので、数学を勉強しようか
(ちなみに、君以外は全員ふつうにわかってるぞ)
126: 2019/02/03(日)23:06 ID:RwDwNYzW(26/27) AAS
>>125 がんばれよー
129: 2019/02/03(日)23:11 ID:RwDwNYzW(27/27) AAS
>>122 が言っている「パターンマッチ」を彼が調べてくれるといいね
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.502s*