sub linear_sequence { my ($start, $inc) = @_; sub { my $value = $start; $start += $inc; return $value; }; } sub interleave_linear_sequences { my @gen = map linear_sequence(@$_), @_; sub { push @gen, shift @gen; $gen[-1]->(); } } sub alternating { interleave_linear_sequences([1, 2], [-2, -2]); } sub rearranged { interleave_linear_sequences([1, 4], [3, 4], [-2, -2]); } my $a = alternating(); my $r = rearranged(); my %do_report = map {$_=>1} qw(10 100 1000 10000); my $count = 0; my $alternating_sum = my $rearranged_sum = 0; while (%do_report) { $count++; $alternating_sum += 1/$a->(); $rearranged_sum += 1/$r->(); if (delete $do_report{$count}) { print "$count terms:\n", " Alternating: $alternating_sum\n", " Rearranged: $rearranged_sum\n"; } }