誰が何といおうが6日目です。

ってことで、何か晒そう。。。

おもむろに

$gosh

Gaucheを起動して、

(fold + 0 '(1 2 3 4 5))

を実行する。

gosh> (fold + 0 '(1 2 3 4 5))
15

初期値が0の状態でリスト(1 2 3 4 5)を全部足してくれる。
ふむふむ。


ってことは、0と書いてある部分を10にすると、初期値が10の状態でリスト(1 2 3 4 5)を全部足してくれるってことだよね。

(fold + 10 '(1 2 3 4 5))

↑を実行するとこうなった。

gosh> (fold + 10 '(1 2 3 4 5))
25

じゃあ、初期値を0の状態で+を*にすると…120?

(fold * 0 '(1 2 3 4 5))
gosh> (fold * 0 '(1 2 3 4 5))
0

あっ、一番初めが0だから何を掛けても0なのか…orz

(fold * 1 '(1 2 3 4 5))

にしないといけないのか。。。

gosh> (fold * 1 '(1 2 3 4 5))
120

うん、ここまでは何とかなりそう。


じゃあ、分数ならどうなるんだろう?

(fold * 1 '(1/2 1/3 1/4))

ここまでの結果から考えると、1/24か?

gosh> (fold * 1 '(1/2 1/3 1/4))
1/24

予想通りでおいちゃんはうれしいです♪


んじゃ、

(fold - 0 '(1 2 3 4 5))

これは?
-15かな…?

gosh> (fold - 0 '(1 2 3 4 5))
3

…(・ω・)ん?


(pωq)



(・ω・ ;)…なんで?

さて、どんな風に展開されるのか探そうか…


頭の中では[0 - 1 - 2 - 3 - 4 - 5 = -15]ってなってたから、中置記法に直すと…

(- (- (- (- (- 0 1) 2) 3) 4) 5)

こんな感じか…



Σ(・A・)!!

マニュアル、マニュアル…!!

検索したら、マニュアルにたどり着いたよ!!


Function: fold kons knil clist1 clist2 …

[SRFI-1] 基本リスト反復演算子です。単一のリスト clist1 = (e1 e2 … en) を与えられたときには、以下を返します。

(kons en … (kons e2 (kons e1 knil)) … )

n 本のリストが与えられた場合には、kons 関数は n+1 個の引数をとる関数でなければなりません。それぞれのリストから要素をひとつずつと、初期値 knil である「種」あるいは畳み込み状態とよばれるものです。この畳み込み演算は、もっとも短いリストの要素がなくなったところで終了します。与えられるリストの少くともひとつは有限でなければなりません。

こんなんが書いてあった!!

誰か日本語に訳し(ry

(fold - 0 '(1 2 3 4 5))

これと同じ式はこうみたいだ!!1!1↓

(- 5 (- 4 (- 3 (- 2 (- 1 0)))))


ふう…

今日学んだこと : マニュアル嫁!!!