Mathematica 有一个名为 FoldList
FoldList function description 的内置函数。 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|
+---+------+--------+----------+------------+--------------+----------------+
这有点不方便。有什么更好的解决方案吗?
最佳答案
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 中,如果您希望它们在同一个列表中,那么这两个必须是相同的“种类”(形状+类型)。不便来自 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││
│└─┘│└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└───┴─────┴───────┴─────────┘
关于j - FoldList 像 J 中的原语,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23317062/