[過去ログ]
関数型プログラミング言語Haskell Part32 (1002レス)
関数型プログラミング言語Haskell Part32 http://mevius.5ch.net/test/read.cgi/tech/1548720347/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
14: デフォルトの名無しさん [sage] 2019/02/03(日) 21:08:06.34 ID:RwDwNYzW >>13 >>11 が説明してくれたとおりなのだけど、納得できない? http://mevius.5ch.net/test/read.cgi/tech/1548720347/14
20: デフォルトの名無しさん [sage] 2019/02/03(日) 21:20:07.09 ID:RwDwNYzW >>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 に置き換えられる ひとつめの関数の定義により、fact 0 は 1 に置き換えられるので 置き換えはここでとまる 以上をまとめると fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 6 http://mevius.5ch.net/test/read.cgi/tech/1548720347/20
28: デフォルトの名無しさん [sage] 2019/02/03(日) 21:29:11.55 ID:RwDwNYzW >>23 >>>20 >だからfact(1)で無限に続いちゃうよね >1 - 1で fact 0をevalしてまたfact(1)になる >そこで終了条件が必要だけど何にも書いてないから記述通りならずーっと続く そうはならない fact 1 = 1 * fact 0 に簡約される そして fact 0 = 1 であって fact 0 = 0 * fact(0 - 1) とは絶対にならないからここで終わる 高校数学がわかるなら、漸化式と同じだと思えばよい http://mevius.5ch.net/test/read.cgi/tech/1548720347/28
29: デフォルトの名無しさん [sage] 2019/02/03(日) 21:30:12.31 ID:RwDwNYzW >>25 そうそう。そのとおり。 http://mevius.5ch.net/test/read.cgi/tech/1548720347/29
35: デフォルトの名無しさん [sage] 2019/02/03(日) 21:35:32.72 ID:RwDwNYzW >>33 >いやいやfact(1)の評価は0なんだし 違う どこにそんなことが書かれている? http://mevius.5ch.net/test/read.cgi/tech/1548720347/35
39: デフォルトの名無しさん [sage] 2019/02/03(日) 21:37:39.39 ID:RwDwNYzW >>34 えーと、すまん、「どんな場合でも」再帰は1を返したら終了すると考えているのなら それは大間違いだ http://mevius.5ch.net/test/read.cgi/tech/1548720347/39
41: デフォルトの名無しさん [sage] 2019/02/03(日) 21:39:25.68 ID:RwDwNYzW >>23 >>>19 >理解したのは>>9の通りで >仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる この推測が間違っているので、いったん忘れて素直にプログラムを読んでみよう http://mevius.5ch.net/test/read.cgi/tech/1548720347/41
43: デフォルトの名無しさん [sage] 2019/02/03(日) 21:41:09.23 ID:RwDwNYzW >>42 >>29 や >>31 でお墨付きを与えたのが間違いだった 君はまだ理解できていない (断言) http://mevius.5ch.net/test/read.cgi/tech/1548720347/43
45: デフォルトの名無しさん [sage] 2019/02/03(日) 21:43:10.37 ID:RwDwNYzW >>44 忘れろ 忘れてプログラムを読み直しな http://mevius.5ch.net/test/read.cgi/tech/1548720347/45
48: デフォルトの名無しさん [sage] 2019/02/03(日) 21:44:56.66 ID:RwDwNYzW もういちど繰り返すが、 >>41 に書いたように 「仮定として1かtrueを返したら再帰は止まる仕様になってると推測している」 が大間違いだ http://mevius.5ch.net/test/read.cgi/tech/1548720347/48
57: デフォルトの名無しさん [sage] 2019/02/03(日) 21:53:28.07 ID:RwDwNYzW もしかすると、だけど fact 0 = 1 を実行した直後に fact 1 = 1 * fact 0 が続くと考えている? もうしそうだとしたらそこが間違いで fact 0 = 1 fact n = n * fact(n - 1) はそのどちらかしか実行されない http://mevius.5ch.net/test/read.cgi/tech/1548720347/57
63: デフォルトの名無しさん [sage] 2019/02/03(日) 22:00:18.19 ID:RwDwNYzW >>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 http://mevius.5ch.net/test/read.cgi/tech/1548720347/63
68: デフォルトの名無しさん [sage] 2019/02/03(日) 22:08:07.10 ID:RwDwNYzW >どのみち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 のうち 3 * 2 * 1 * fact 0 が 3 * 2 * 1 * 1 に変化するところだよ http://mevius.5ch.net/test/read.cgi/tech/1548720347/68
76: デフォルトの名無しさん [sage] 2019/02/03(日) 22:19:53.64 ID:RwDwNYzW >>73 fact 0 = 1 で「終了する」というのが間違い fact 0 = 1 では、fact 0 が 1を返す(正確に言うと1に簡約する) ということしか定義していない ただ、もうfact関数を呼び出していないので、再帰呼出しはここで止まる そして fact 0 = 1 がマクロ定義ということも勘違いなので忘れよう >>67 が解説してくれた fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 -- fact 0が・・ = 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの? = 6 http://mevius.5ch.net/test/read.cgi/tech/1548720347/76
78: デフォルトの名無しさん [sage] 2019/02/03(日) 22:22:31.24 ID:RwDwNYzW >>75 上に書いたけど、漸化式は理解している? 同じ書き方をします Haskellは数学を基盤としているので、数学的な記述方法でプログラムが書けます 「再帰から脱出するならそのためのコードは絶対必要なはずなんだ」とあるけど、 もう書かれているよ fact 0 = 1 って http://mevius.5ch.net/test/read.cgi/tech/1548720347/78
80: デフォルトの名無しさん [sage] 2019/02/03(日) 22:25:28.82 ID:RwDwNYzW >fact 0は1なんだからその次はfact(1)になるでしょ その次はもうないよ http://mevius.5ch.net/test/read.cgi/tech/1548720347/80
83: デフォルトの名無しさん [sage] 2019/02/03(日) 22:28:21.00 ID:RwDwNYzW >>81 君の言い方に合わせると「終了条件」と考えてよい 正しく説明すると >>40 になる http://mevius.5ch.net/test/read.cgi/tech/1548720347/83
91: デフォルトの名無しさん [sage] 2019/02/03(日) 22:34:30.64 ID:RwDwNYzW うーん、C言語だと int fact(int n) { if (n == 0) return 1; else return n * fact (n - 1); } と書くのと同じなんだけどねえ http://mevius.5ch.net/test/read.cgi/tech/1548720347/91
94: デフォルトの名無しさん [sage] 2019/02/03(日) 22:39:05.88 ID:RwDwNYzW >>92 この1行目はどこから出てきたの? =3 * 2 * 1 * 1 * fact(1-1) この辺を脳内でテキトーに処理してるからわからないんだよ fact 3 のところから地道に書きながら置き換えてみな http://mevius.5ch.net/test/read.cgi/tech/1548720347/94
97: デフォルトの名無しさん [sage] 2019/02/03(日) 22:42:33.19 ID:RwDwNYzW >>95 そうなのか。C言語はやったことがあるようだけど >>91 は理解できてる? http://mevius.5ch.net/test/read.cgi/tech/1548720347/97
99: デフォルトの名無しさん [sage] 2019/02/03(日) 22:43:59.88 ID:RwDwNYzW >>95 ああ、>>9 みたいに一気に展開するのではなくて、 fact 3 = のところからひとつずつ地道に置き換えてみた? もしやってないなら、今すぐやってみよう http://mevius.5ch.net/test/read.cgi/tech/1548720347/99
100: デフォルトの名無しさん [sage] 2019/02/03(日) 22:44:48.18 ID:RwDwNYzW >>98 どうでもよくないから君は間違っている http://mevius.5ch.net/test/read.cgi/tech/1548720347/100
116: デフォルトの名無しさん [sage] 2019/02/03(日) 22:59:39.94 ID:RwDwNYzW >>114 >直前の結果が1なので ここはOK >fact(n-1)に与えられてfact(1-1) ここが間違い。与えられるfact(n-1)がもう存在しない http://mevius.5ch.net/test/read.cgi/tech/1548720347/116
120: デフォルトの名無しさん [sage] 2019/02/03(日) 23:03:02.44 ID:RwDwNYzW 理解できたようで良かったけど、結局は >>57 がわかってなかったということだなあ http://mevius.5ch.net/test/read.cgi/tech/1548720347/120
124: デフォルトの名無しさん [sage] 2019/02/03(日) 23:04:21.15 ID:RwDwNYzW >>121 普通に数学の手法なので、数学を勉強しようか (ちなみに、君以外は全員ふつうにわかってるぞ) http://mevius.5ch.net/test/read.cgi/tech/1548720347/124
126: デフォルトの名無しさん [sage] 2019/02/03(日) 23:06:11.09 ID:RwDwNYzW >>125 がんばれよー http://mevius.5ch.net/test/read.cgi/tech/1548720347/126
129: デフォルトの名無しさん [sage] 2019/02/03(日) 23:11:25.99 ID:RwDwNYzW >>122 が言っている「パターンマッチ」を彼が調べてくれるといいね http://mevius.5ch.net/test/read.cgi/tech/1548720347/129
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.032s