Annotation of loncom/homework/caparesponse/test.pl, revision 1.3
1.1 albertel 1: use strict;
1.3 ! albertel 2: use warnings;
1.1 albertel 3:
1.3 ! albertel 4: my $n = 0;
! 5: my $total = 0;
! 6: my $num_left = 0;
! 7: my @order;
! 8:
! 9: sub factorial {
! 10: my $input = CORE::int(shift);
! 11: return "Error - unable to take factorial of an negative number ($input)" if $input < 0;
! 12: return "Error - factorial result is greater than system limit ($input)" if $input > 170;
! 13: return 1 if $input == 0;
! 14: my $result = 1;
! 15: for (my $i=2; $i<=$input; $i++) { $result *= $i }
! 16: return $result;
! 17: }
! 18:
! 19: sub init {
! 20: my ($size) = @_;
! 21: @order = (0..$size-1);
! 22: $n = $size;
! 23: $total = $num_left = &factorial($size);
! 24: }
! 25:
! 26: sub get_next {
! 27: if ($num_left == $total) {
! 28: $num_left--;
! 29: return @order;
! 30: }
! 31:
! 32:
! 33: # Find largest index j with a[j] < a[j+1]
! 34:
! 35: my $j = scalar(@order) - 2;
! 36: while ($order[$j] > $order[$j+1]) {
! 37: $j--;
! 38: }
! 39:
! 40: # Find index k such that a[k] is smallest integer
! 41: # greater than a[j] to the right of a[j]
! 42:
! 43: my $k = scalar(@order) - 1;
! 44: while ($order[$j] > $order[$k]) {
! 45: $k--;
! 46: }
! 47:
! 48: # Interchange a[j] and a[k]
! 49:
! 50: @order[($k,$j)] = @order[($j,$k)];
! 51:
! 52: # Put tail end of permutation after jth position in increasing order
! 53:
! 54: my $r = scalar(@order) - 1;
! 55: my $s = $j + 1;
! 56:
! 57: while ($r > $s) {
! 58: @order[($s,$r)]=@order[($r,$s)];
! 59: $r--;
! 60: $s++;
! 61: }
! 62:
! 63: $num_left--;
! 64: return(@order);
! 65: }
! 66:
! 67: &init(9);
! 68: while($num_left) {
! 69: print(join(':',&get_next()).$/);
! 70: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>