J 的新手。我喜欢它,但还远未精通。 我设法遇到了一个问题,但我不知道为什么会这样。如果有人可以解释为什么会发生这种情况,我可以了解更多关于这种直截了当的语言。
基本上,我先求差 (-),然后求平方 (*:),然后求和 (+/),然后求平方根 (%:)。 现在误差平方和部分 ((+/@:*:@:-) ) 工作正常:
1 2 3 4 5 (+/@:*:@:-) 2 2 2 2 2
15
然后我可以通过这种方式得到平方根(只需在左侧添加 %:):
%: 1 2 3 4 5 (+/@:*:@:-) 2 2 2 2 2
3.87298
但是当我在中间的 atco(默认?)部分的左侧添加平方根时,它并没有给我正确的结果:
1 2 3 4 5 (%:@:+/@:*:@:-) 2 2 2 2 2
1.57001
它返回 1.57001 而不是 3.87298。
我的理解是我所做的只是添加一个“然后求平方根”,但显然我错了。但我不明白为什么。
当我剖析时:
require 'debug/dissect'
dissect '1 2 3 4 5 (%:@:+/@:*:@:-) 2 2 2 2 2'
我看到 diff (-) 和 square (*:) 在它们自己的解剖框中。但是最后一个框将总和 (+/) 和平方根 (%:) 组合在一起,显示 %:@:+/。不是 +/和 %: 的单独框。
正如我所说,我是 J 的新手,正在努力理解为什么会发生这种情况。
我已经尝试改用 &、&: 和 @,但正如预期的那样并没有解决这个问题。 它似乎也不是由于某些成分限制,因为它工作正常(有更多的 atco 组合):
(>:@:>:@:>:@:>:@:>:@:>:@:>:@:>:@:>:) 2 2 2
11 11 11
谢谢
最佳答案
您遇到的问题是
(%:@:+/@:*:@:-)
被评价为
1 2 3 4 5 ((%:@:+)/@:*:@:-) 2 2 2 2 2
1.57001
不是
1 2 3 4 5 %:@:(+/@:*:@:-) 2 2 2 2 2
3.87298
因为连词尽可能多地占用左操作数。这意味着当您希望应用 %:
时,*:@:-
正在由 %:@:+/
处理您的部分结果+/@:*:@:-
由于您刚刚开始使用 J,这可能有点高级,但在某些时候您可能想要阅读 Henry Rich 为 C 程序员编写的 J 的默认编程部分。关于J句是如何解析的,里面有很好的解释。当您想更改执行顺序时,括号是您的 friend 。 https://www.jsoftware.com/help/jforc/contents.htm#_Toc191734581
编辑:正如@Eelvex 在下面的评论中指出的那样,中断实际上发生在 (+/)
处,但结果是相同的,因为从左到右计算连词的方式。
关于j - 一旦在默认情况下添加平方根,结果就会不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69401178/