FoldList как примитив в J

Mathematica имеет встроенную функцию под названием FoldList Описание функции FoldList. Есть ли подобный примитивный глагол в J?

(Я знаю, что у J есть ^: глагол, который как Nest а также FixedPoint.)

Чтобы уточнить мой вопрос, у J есть двоичный глагол, поэтому обычно u / x1 x2 x3 становится x1 u (x2 u x3), который работает так же, как FoldList, в обратном порядке.

За исключением случаев, когда функция u принимает yв отличной от x, В FoldList есть начальный x, В J, если x3 - это другая форма, нужно полагаться на < упаковать это вместе. Например, нужно упаковать и распаковать

   [list =. (;/ 3 3 4 3 3 34),(< 1 2)
+-+-+-+-+-+--+---+
|3|3|4|3|3|34|1 2|
+-+-+-+-+-+--+---+

   tf =: 4 : '<((> x) , >y)'


   tf/ list
+----------------+
|1 2 3 3 4 3 3 34|
+----------------+
    tf/\ |. list
+---+------+--------+----------+------------+--------------+----------------+
|1 2|1 2 34|1 2 34 3|1 2 34 3 3|1 2 34 3 3 4|1 2 34 3 3 4 3|1 2 34 3 3 4 3 3|
+---+------+--------+----------+------------+--------------+----------------+

что-то вроде неудобно. Есть ли лучшие решения?

2 ответа

u/\ подходит очень близко (если вы не возражаете против правильного сворачивания):

+/\ 1 2 3 4
1 3 6 10

*/\1+i.10
1 2 6 24 120 720 5040 ...

 (+%)/\7#1. NB. continued fraction of phi
 1 2 1.5 1.66667 1.6 1.625 1.61538

редактировать на вашем редактировании:

Первые два элемента FoldList являются x а также f(x,a), В J эти два должны быть одного и того же "вида" (shape+type), если вы хотите, чтобы они были в одном и том же списке. Неудобство исходит из структур данных J, а не из-за отсутствия FoldList глагол. Если вы исключите x из списка все проще:

FoldListWithout_x =: 1 : 'u/ each }.<\y'

   ; FoldListWithout_x 1 2 3 4
┌─────┬───────┬─────────┐
│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
││1│2│││1│2│3│││1│2│3│4││
│└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└─────┴───────┴─────────┘
   >+ FoldListWithout_x 1 2 3 4
3 6 10
   (+%) FoldListWithout_x 7#1
┌─┬───┬───────┬───┬─────┬───────┐
│2│1.5│1.66667│1.6│1.625│1.61538│
└─┴───┴───────┴───┴─────┴───────┘

Следующим логическим шагом является включение в штучной упаковке x после создания сгибов, но для этого потребуется либо более сложный код, либо индивидуальная конструкция. Например:

FoldList =: 1 :'({.y) ; u FoldListWithout_x y'
+ FoldList 1 2 3 4
┌─┬─┬─┬──┐
│1│3│6│10│
└─┴─┴─┴──┘
; FoldList 1 2 3 4
┌─┬─────┬───────┬─────────┐
│1│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
│ ││1│2│││1│2│3│││1│2│3│4││
│ │└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└─┴─────┴───────┴─────────┘

против

FoldList =: 1 :'(<{.y) ; u FoldListWithout_x y'
+ FoldList 1 2 3 4
┌───┬─┬─┬──┐
│┌─┐│3│6│10│
││1││ │ │  │
│└─┘│ │ │  │
└───┴─┴─┴──┘
; FoldList 1 2 3 4
┌───┬─────┬───────┬─────────┐
│┌─┐│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
││1│││1│2│││1│2│3│││1│2│3│4││
│└─┘│└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└───┴─────┴───────┴─────────┘

Я думаю, что комментарий @Dan Bron заслуживает ответа. Это обсуждается с некоторыми решениями в http://www.jsoftware.com/pipermail/programming/2006-May/002245.html

если мы определим наречие (изменено по ссылке выше)

   upd =: 1 : 0
:
 u&.> /\ ( <"_ x),<"0 y
)

затем

1 2  , upd |. 3 3 4 3 3 34 
┌───┬──────┬────────┬──────────┬────────────┬──────────────┬────────────────┐
│1 2│1 2 34│1 2 34 3│1 2 34 3 3│1 2 34 3 3 4│1 2 34 3 3 4 3│1 2 34 3 3 4 3 3│
└───┴──────┴────────┴──────────┴────────────┴──────────────┴────────────────┘
Другие вопросы по тегам