有没有一种方法可以在 APL 中使用不需要循环或流量控制的单行创建斐波那契序列?
\n\n我已经使用函数\xe2\x86\x92和条件测试完成了它,但我觉得必须有一种更优雅的、声明性的方式。我发现一个声称在一行上完成的例子在 gnu-apl 上不起作用 - 看起来它在正确的轨道上,使用矩阵数学,但我遇到了困难跟随,并且无法调整它以使其正常工作。
我正在追求 APL 作为我的第一种真正的编程语言(我喜欢这些符号。我就是喜欢。)我现在正在使用 Project Euler 作为更好地熟悉的一种方式。
\n另一种方法是使用(相对较新的)幂运算符。GNU APL 可能支持也可能不支持,它可以与 Dyalog(我使用 13.1)和 NGN APL 配合使用。
\n\n尝试
\n\n ({\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} \xe2\x8d\xa3 20) (1 1) \nRun Code Online (Sandbox Code Playgroud)\n\n与其他示例一样,迭代是隐藏的,这里使用幂运算符。
\n\n表达方式
\n\n({\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} \xe2\x8d\xa3 3) (1 1)\nRun Code Online (Sandbox Code Playgroud)\n\n是在做
\n\n{\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} {\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} {\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} 1 1\nRun Code Online (Sandbox Code Playgroud)\n\n在幕后。
\n\n1 1 是种子值,每个连续的 {\xe2\x8d\xb5,+/\xc2\xaf2\xe2\x86\x91\xe2\x8d\xb5} 只是连接最后两个元素的总和。
\n我也喜欢 APL 的符号,以及它的数组编程能力。其他数组语言可能更强大,例如 J,但它们缺乏 APL 符号和显式语法的美感。
\n\n我刚刚尝试了您在 GNU APL 中链接到的示例,它工作正常:
\n\n \xe2\x86\x910 1\xe2\x86\x93\xe2\x86\x91+.\xc3\x97/5/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n5\n \xe2\x86\x910 1\xe2\x86\x93\xe2\x86\x91+.\xc3\x97/6/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n8\n \xe2\x86\x910 1\xe2\x86\x93\xe2\x86\x91+.\xc3\x97/7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n13\nRun Code Online (Sandbox Code Playgroud)\n\n如果您无法让它工作,请确保:
\n\n\xc3\x97是 U+00D7 乘法符号,而不是 X;\xe2\x8d\xb4是 U+2374 APL 功能符号 RHO,不是任何其他希腊语 Rho,也绝对不是 P;\xe2\x8a\x82是 U+2282 的子集;等等;N\xe2\x86\x907在上一行中单独定义 N。如果您仍然无法使其工作,请从右侧开始一步一步地输入公式:
\n\n 2 2\xe2\x8d\xb41 1 1 0\n1 1\n1 0\n \xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n 1 1 \n 1 0 \n 7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \n 1 0 1 0 1 0 1 0 1 0 1 0 1 0 \n +.\xc3\x97/7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n 21 13 \n 13 8 \n \xe2\x86\x91+.\xc3\x97/7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n21 13\n13 8\n 0 1\xe2\x86\x93\xe2\x86\x91+.\xc3\x97/7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n13\n 8\n \xe2\x86\x910 1\xe2\x86\x93\xe2\x86\x91+.\xc3\x97/7/\xe2\x8a\x822 2\xe2\x8d\xb41 1 1 0\n13\nRun Code Online (Sandbox Code Playgroud)\n\n至于问题标题,我认为这个矩阵公式解决了它(好@mappo!)
\n\n如果我在打高尔夫球,我可能会使用较短的变体,但仅此而已:
\n\n 2\xe2\x8c\xb7\xe2\x88\x8a+.\xc3\x97/7/\xe2\x8a\x82\xe2\x88\x98.\xe2\x88\xa8\xe2\x8d\xa81 0\n13\nRun Code Online (Sandbox Code Playgroud)\n\n那里有 24 到 17 个字符。看看你是否能弄清楚:-)
\n\nGNU APL 还不错,虽然它缺乏一些现代功能,但请随身携带一份 Dyalog APL 程序员指南和语言参考,因为它是有关该语言的最全面的参考之一。
\n