魔術師をめざして

魔術師を目指して、相場・数学・プログラム言語を研究しています。

問題 #0

#0
1からnまでの和を答えよ。

#0のhaskellによる答え。

sum[1..n]

えっ、ずるい。じゃ、別解。

sum 0 = 0
sum n = n + sum(n-1)

haskellでよく使う再帰だが、pythonのforループで書いたほうが、効率がいい。再帰だと、スタックを浪費するからだが、haskellでは、末尾再起でなく、普通に書いても、コンパイラが勝手に、スタックを消費しない、末尾再起に最適化してくれるので、問題ないのだ。

ついでに

take 10 [1..]

上のhaskellのtakeは、1から始まる無限リストから、最初の10個を取る関数。
haskellは、純粋関数型言語の特徴ともいえる、遅延評価戦略を用いている。他の言語だと無限リストを用意してから、その先頭の、10個を取ろうとする。しかし、無限の処理だから、何時まで経っても終らない。これに対し、haskellの遅延評価では、必要になるまでは、評価しないので、10個取って終わり。瞬時に終わる。
遅延評価には欠点もあるが、その説明はは割愛する。

f:id:fxrobot:20201112185905j:plain