関数の作成


J言語の本を読んでいたら、次のような課題がありました。


f(n) = 5 n - 1 をJ言語で表現せよ。
1〜10 の数列について、実行し、一覧表にせよ。


回答は次のようなものでした。

   N =: ]
   F =: (5: * N) - 1:
   i =: >: i.10
   i ,: F i
1 2  3  4  5  6  7  8  9 10
4 9 14 19 24 29 34 39 44 49

自分だったら、どう書くかなぁ、と考えてみました。

   (5&*) 3
15
   (_1&+) 15
14
   fx=:(_1&+)@(5&*)
   fx 3
14
   fx i
4 9 14 19 24 29 34 39 44 49
   i,:fx i
1 2  3  4  5  6  7  8  9 10
4 9 14 19 24 29 34 39 44 49

APLで書かれたライフゲームをJ言語に翻訳(昨日の記事)していて、APLではω(オメガ)という関数を使って式の中で使います。それに近いのがN =: ]なのですが、うまく使えていません。一方、J言語では動詞が並んで一つの動詞になった場合の挙動について、総括してトレインと呼び、基本的に二つ並んだ場合(フック)または三つ並んだ場合(フォーク)の繰り返しとして説明します。その流れを切る作用をするのが@(アトマーク)や@:(アトマークコロン)なのでその辺を試行錯誤すればたいていのことは済んでしまう。


とりあえず、わたしのやったやり方の方がわたし的には理解しやすいです。

以上


追記:
3次くらいの方程式ではどうか考えてみました。

f(x) = x^3 + x^2 - 2*x - 3
f(1) = - 3
f(2) = 5
   (^&3) 2
8
   (^&2) 2
4
   (*&2) 2
4
   ( (^&3) + (^&2)) 2
12
   (_3&+)@( ( (^&3) + (^&2)) - (*&2)) 2
8
   (_3&+)@( ( (^&3) + (^&2)) - (*&2)) 2
5
   fx=:(_3&+)@( ( (^&3) + (^&2)) - (*&2))
   i,:fx i
 1 2  3  4   5   6   7   8   9   10
_3 5 27 69 137 237 375 557 789 1077

   F=:( ( (N ^ 3:) + (N ^ 2:)) - (2:* N)) - 3:
   i,:F i
 1 2  3  4   5   6   7   8   9   10
_3 5 27 69 137 237 375 557 789 1077

どちらもあまり気持ちよくないですね。
また考えます。