Рекурсия на языке J - PullRequest
1 голос
/ 08 мая 2019

У меня есть начальный (10 x 2) вектор v1, и (100 x 10 x 10) матрица Cos. Глагол диада 'move' возвращает другой (10 x 2) вектор с использованием (10 x 10) i-й матрицы из Cos в качестве входа.

$Cos
   100 10 10
$v1 
   10 2 
v1
    0.89 0.91    
    0.01 0.24
    0.88 0.43
    0.43 0.32
    0.85 0.84
    0.27 0.31
    0.1  0.11
    0.49 0.9
    0.2  0.28
    0.66 0.96
(0{Cos) move v1
    1         1
    0.426426  0
    0.819478  0.304798
    0.66484   0.0362481
    0.505905  0.278294
    0.149514  0.0516271
    0         0.40583
    0.233825  0.759351
    0.03464   0.630262
    0.502968  0.686788

Я хочу сделать матрицу, использующую рекурсию, такую, чтобы

$p
   100 10 2

как

0{p =: (0{Cos) move (v1)
1{p =: (1{Cos) move (p0)
2{p =: (2{Cos) move (p1)
...

В настоящее время я читаю рекурсивный раздел (1: `) из вики на языке J, но я немного растерялся.

Должен ли я просто использовать цикл, используя ^ :?

Заранее спасибо

1 Ответ

1 голос
/ 08 мая 2019

Из того, что вы описываете, я бы попробовал

move~/\ v1, cos

, это вставило бы move между последовательными элементами списка, образованного добавлением v1 к cos.~ (рефлексное наречие) будет означать, что ваша вставка move сначала получит результат O{cos move v1, затем 1{cos move (0{cos move v1), который совпадает с 1{cos move (0{p), и по вашему определению выше это будет значение 1{p и так далее по всему массиву.

Рекурсия обычно резервируется для случаев, когда проблемы можно разбить на более простые проблемы, пока ответ не будет возвращен по цепочке.Поскольку это не похоже на проблему такого типа, это может быть причиной того, что рекурсия сбивает вас с толку.

...