#!/usr/bin/perl use strict; use warnings; use Test::More tests => 12; use Acme::Gosub; sub factorial { my $n = shift; my $prod = 1; gosub CALC; return $prod; CALC: if ($n > 1) { $prod *= ($n--); gosub CALC; } greturn; } sub factorial2 { my $n = shift; my $prod = 1; gosub CALC; return $prod; CALC: if ($n > 1) { $prod *= ($n--); gosub ("CALC"); } greturn; } sub factorial3 { my $n = shift; my $prod = 1; gosub "CALC"; return $prod; CALC: if ($n > 1) { $prod *= ($n--); gosub "CA".uc("l")."C"; } greturn; } sub pythagoras { my ($x, $y) = (@_); my ($temp, $square, $sum); $sum = 0; $temp = $x; gosub SQUARE; $sum += $square; $temp = $y; gosub SQUARE; $sum += $square; return $sum; SQUARE: $square = $temp * $temp; greturn; } # TEST is (factorial(3), 6, "factorial(3)"); # TEST is (factorial(1), 1, "factorial(1)"); # TEST is (factorial(4), 24, "factorial(4)"); # TEST is (pythagoras(2,6), 40, "pyth(2,6)"); # TEST is (pythagoras(1,1), 2, "pyth(1,1)"); # TEST is (pythagoras(4,3), 25, "pyth(4,3)"); # TEST is (factorial2(3), 6, "factorial2(3)"); # TEST is (factorial2(1), 1, "factorial2(1)"); # TEST is (factorial2(4), 24, "factorial2(4)"); # TEST is (factorial3(3), 6, "factorial3(3)"); # TEST is (factorial3(1), 1, "factorial3(1)"); # TEST is (factorial3(4), 24, "factorial3(4)");