2

如何使用 Perl 6 中的“列表理解”创建非平方列表(即平方根不是整数的整数)?我从 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;

作为列表理解,我怎么能做到这一点?

4

1 回答 1

4

实际上,您的示例my @y = ($_**2 + 1 for 1 .. 10);是 Perl 6 编写列表推导的方式。您还可以按照Perl 6 设计文档 S04中的建议添加条件测试:

为了便于编写列表推导,允许循环语句修饰符包含单个条件语句修饰符:
...
@evens = ($_ * 2 if .odd for 0..100);

以下是如何编写非正方形的 Perl 6 列表理解(最多 30 个):

my @non_squares = ($_ if .sqrt != .sqrt.Int for 1 .. 30);

一点解释:在循环的每次迭代中for,将 1 到 30 范围内的当前数字分配给默认变量$_(又名“it”)。默认情况下,在“it”上调用没有调用者的方法调用(即.sqrt与 相同$_.sqrt)。因此,对于 1 到 30 范围内的每个数字,检查其平方根以查看它是否具有非整数平方根。如果为真,则将其包含在列表中。

于 2015-05-23T15:06:20.783 回答