すべての実数は次のように表すことができる
tex:\Large N=a0+\frac{1}{a1+\frac{1}{a2+\frac{1}{a3+\frac{1}{a4+\dots}}}}]
と物の本に書いてあります。
これがJ言語では、
pr=:[+1:%]
と定義できるようです。(Kenneth Iverson)
以下実験です。
pr=:[+1:%] pr +-+-+--------+ |[|+|+--+-+-+| | | ||1:|%|]|| | | |+--+-+-+| +-+-+--------+ 2 pr 5 2.2 pr/ 2 5 2.2 pr/2 5 5 2.19231 2 + 1%5 2.2 2+(1%(5+(1%5))) 2.19231
関数prの定義が分かりにくいので、まずprとだけタイプして改行すると、J言語による解析をしてくれます。
つまり、prは3つの関数からなる定義で、三つ目が再度3つの関数からなる定義になっています。
3つの関数の両サイドに引数を作用させると、両引数が両方とも1番目の関数と3番目の関数に作用して、その結果を真ん中の関数が処理します。
2 pr 5の場合、2[5=>2、2(1:%])5=>1%5=>0.2となり、この結果の2と0.2を足して2+0.2=>2.2が結果になります。
pr/2 5のスラッシュは数列の間にすべてprを作用させるということで、2 pr 5と同じになります。
pr/ 2 5 5は、同様に2 pr 5 pr 5になります。この結果を当初の目的の
の結果になっていることを最後に検証しています。
追記:
prを使って、フィボナッチ数列が作成できます。
pr/\ 1 1 1 1 1 1 1 1 1 1r1 1 2 3r2 5r3 8r5 13r8 21r13 34r21 55r34 89r55 pr/\ 1 1 1 1 1 1 1 1 1 1 1 2 1.5 1.66667 1.6 1.625 1.61538 1.61905 1.61765 1.61818
1r1というのは結果を実数で出したいときの引数の与え方です。
ただの1にすると結果が小数で表されます。
1.618って黄金比でしたっけ?
黄金比に収束するということでしょうか。
不思議ですね。
追記;
ほんとうに収束するかどうかの実験
tex: \frac{\(1 + \sqrt 5\)}{2}]
pr=:[+1:%] pr/\ 1 1 1 1 1 1 1 1 1 1 1 1r1 1 2 3r2 5r3 8r5 13r8 21r13 34r21 55r34 89r55 144r89 233r144 pr1=:1:+1:%] pr1 ^:7 (2) 1.61765 pr1 ^:7 (2r1) 55r34 pr1 ^:100 (2) 1.61803 pr1 ^:_ (2) 1.61803 2 %~ 1 + %:5 1.61803 (pr1 ^:_ (2)) = (2 %~ 1 + %:5) 1
^:7とかはその前の関数を7回適用するという意味で、^:_は無限回適用するという意味になります。
これが、の結果と同一になることが確認できました。