コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

foldl, foldrを元にした、蓄積変数付き、脱出可能なloop関数

簡単なfoldl

簡単なfoldlの計算から。

Prelude> foldl (-) 1 [2, 3, 4]
-8
Prelude> foldl (-) 1 [2, 3, 4, 5, 6]
-19

問題

次の問題を考えてみる。

初期値1に対し、2, 3, 4, ... を順にマイナスしていく。
累積値が-5以下になったところで、その累積値を出力せよ。

こうやるとどうだろう。

Prelude> foldl (\x y -> if x <= -5 then x else x - y) 1 [2, 3, 4, 5, 6]
-8

答えは合っているけれど、リストの末尾まで計算を続けている。
foldlは計算を途中でやめられないのだ。

参考記事を元に実装

.
.

これらの参考記事のコードをアレンジして、脱出可能なループ関数myLoopを作ってみた。

myLoopの、

  • 基底部はfoldlに似ている。
  • 再帰部はfoldrに似ている。

これで、計算途中で脱出できるようになった。

.
.

19/06/09追記

この中のどれか、なのかなあ。

.
.