Yet Another Post on "Pascal Triangle"
又名:如何用一行Perl 6打印杨辉三角前n行。
从此时开始到目前为止,网上至少有三篇关于如何用Perl 6打印杨辉三角的文章:这里(TimToady), 这里(Moritz), 和 这里(Masak)。
"There's more than one way to do it.",好吧,我也来写一个,下面这行代码打印杨辉三角的前10行:
([1], -> @p { 0, @p Z+ @p, 0 } ... *).[^10].perl.say;
(......多少都有些抄袭的嫌疑,其实就是直接拼成一行了,不是吗?:))
简单解释下:
"infix:<...>
"称为"Series Operator"(S03),相当于把对一个块的求值结果push
到最前面的List
里面,直到满足右边的条件为止。比如:
(1, {$_ + 1} ... 5).perl.say;
→ (1, 2, 3, 4, 5)
"*
"在这里是一个被叫做"Whatever
"(S02)的东西,在这里起构造惰性求值列表的作用。
中间自"-> { }
"起,是一个由"->
"(S06)构造的轻量型匿名函数块,即要应用("apply")的部分。类似于Perl 5中"map BLOCK LIST
"的"BLOCK
"。同时,"Z+
Operator"(S03)将两边列表结对相加。关于此操作符的用法举例如下:
(1, 2, 3 Z+ 4, 5, 6).perl.say;
→ (5, 7, 9)
额外一提:"Z+
"属于"Zip Operator"系列,类似的还有"Z~
",可以用它实现成对字符串拼接:
(1, 2, 3 Z~ 4, 5, 6).perl.say;
→ ("14", "25", "36")
现在,把代码中的"10
"改成需要打印的行数,就可以实现"用一行Perl 6打印杨辉三角前n行"了。:)
顺便说下,现在想试试Perl 6的话用不着安装,直接Try Rakudo!
Leave a comment