3

List::Gen私は、Perl にもたらされた関数型プログラミングのパラダイムが大好きです。リストの長さはアプリオリにわからないため、少し難しいですが、それを使用して Collat​​z シーケンスを作成することは可能です

1次のコードでは、シーケンスの最後に最後の行がありません。

use List::Gen '*';
iterate{ $_%2 ? 3*$_+1 : $_/2 }->from( 23 )->while( '!=1' )->say;

これは次を印刷します:

23 70 35 106 53 160 80 40 20 10 5 16 8 4 2

このアプローチで本質的に必要なのはdo-while. while_ドキュメントでは、 の「先読み」バージョンであるについて言及してwhileいますが、インタープリターはそのようなメソッドを見つけることができません。

4

2 に答える 2

0

definedエレメントの-ness をテストして、リストをいつ終了するかを決定する回避策を次に示します。チェーン内でundefa に遭遇した直後に要素を設定するには、反復子の定義を変更する必要があります。1

iterate{ $_ == 1 ? undef : $_%2  ? 3*$_+1 : $_/2 }->from( 23 )->while( 'defined' )->say;

印刷する

23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
于 2015-06-05T10:35:56.050 に答える