【问题标题】:Is there a J idiom for adding to a list until a certain condition is met?是否有 J 成语用于添加到列表直到满足特定条件?
【发布时间】:2015-05-30 06:08:25
【问题描述】:

假设您正在使用显而易见的蛮力算法生成斐波那契数列。如果我提前知道要生成的斐波那契数,我可以使用幂连词^: 来做这样的事情:

(, [: +/ _2&{.)^:20 i.2

当斐波那契达到某个极限时,我该如何停止,比如1e6? (我知道如何在使用while. 的函数中执行此操作,但这并不好玩。)

我想强调的是,这是关于 J 的一般问题,而不是关于斐波那契的具体问题。不要被斐波那契数字分心。问题的核心是如何在满足某些条件之前一直追加到列表。

【问题讨论】:

    标签: j


    【解决方案1】:

    Power 还有a verb form u^:v^:n,其中第二个动词可以用作检查。例如:double (+:) while (n is _) 小于 100 (100&>):

    +:^:(100&>)^:_ ] 1
    128
    
    +:^:(100&>)^:_ ] 3
    192
    

    像往常一样,要附加到幂的结果,你把名词框起来:

    +:^:(100&>)^:(<_) ] 3 
    3 6 12 24 48 96 192
    

    【讨论】:

    • “像往常一样,要附加到幂的结果,你把名词框起来”。我不知道这个! J. 中更多的 ad hoc 多态性。
    • J 将接受a: 代替(&lt;_)。我不知道这是否更惯用,还是只是另一个 J 谜。
    【解决方案2】:

    我认为这个问题的最佳答案是 Henry Rich 为 C 程序员编写的 J 书。具体来说,它使用电源连接 ^: 。您也可以使用它来收敛直到没有变化,这样就不需要定义限制。亨利使用的例子是:

    2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
    128 192 160 112 144 176
    

    ^:_ 电源连接重复直到没有变化,^:(100&amp;&gt;@:]) 测试结果是否小于 100。如果是,则将 ^: 应用于 1 并完成循环 2*同样,如果它不小于 100,则 ^: 将应用于 0,这将导致它什么也不做,也没有任何变化,并且循环退出。它使用"0 作为等级这一事实意味着它可以将加倍函数2* 分别应用于每个1 3 5 7 9 11

    Henry 确实比我更好地解释了这个过程,所以这里是进一步阅读的参考。 http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389

    【讨论】:

    • 我知道如何将力量连词与动词和_一起使用,但我没有想到将它们组合在一起。
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2021-06-06
    • 2013-03-27
    • 1970-01-01
    • 2018-11-09
    • 2011-07-10
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多