如何使用" list comprehension"创建一个非正方形列表(即平方根不是整数的整数)。在Perl 6?我遇到了显示如何打印非正方形列表的following code from Rosetta Code。
sub nth_term (Int $n) { $n + round sqrt $n }
say nth_term $_ for 1 .. 22;
我对列表理解的理解是,它是一种声明方式,类似于set-builder notation,用于描述编程语言中的列表。
到目前为止,我最接近的是使用for
关键字。但由于这实际上只是一个内联循环,我认为这在技术上并不是列表理解,即使看起来很相似:
my @y = ($_**2 + 1 for 1 .. 10);
但是,我真正想知道的是,是否有一个"列表理解"创建任何数学上可描述的列表的方法,例如非正方形。这是我如何创建一个非正方形列表(最多30个):
my @non_squares = grep {sqrt($_) != floor(sqrt($_))}, 1 .. 30;
我怎么能这样做列表理解?
答案 0 :(得分:4)
实际上,my @y = ($_**2 + 1 for 1 .. 10);
的示例是编写列表推导的Perl 6方式。您还可以按Perl 6 design document S04:
为了便于编写列表推导,允许循环语句修饰符包含单个条件语句修饰符:
...
@evens = ($_ * 2 if .odd for 0..100);
以下是如何编写非正方形的Perl 6列表理解(最多30个):
my @non_squares = ($_ if .sqrt != .sqrt.Int for 1 .. 30);
一点解释:在for
循环的每次迭代中,1到30范围内的当前数字被分配给默认变量$_
(又名& #34;它&#34)。调用没有调用者的方法调用"它"默认情况下(即.sqrt
与$_.sqrt
相同)。因此,对于1到30范围内的每个数字,检查其平方根以查看它是否具有非整数平方根。如果为true,则它将包含在列表中。