Aufgabe 13

1. Wir üben die Rekursion.

Lösungen

#!/usr/bin/perl
#Aufgabe 13 Rekursion.1
#Berechnet die Fakultät einer Zahl

use strict;
use warnings;
use utf8;

{
my $wert;

print "Ich berechne die Fakultät einer eingegebenen Zahl.\nBitte geben Sie eine Zahl ein, die größer als 0 ist >>> ";	
chomp($wert = <>);
while ($wert < 1){
   print"Die Zahl muss größer als 0 sein!\n";
   print"Bitte geben Sie eine Zahl ein, die größer als 0 ist >>> ";
   chomp($wert = <>);
   }
print "Das Ergebnis lautet: ",&fak($wert),"\n";
}

sub fak($){
   my $zahl=$_[0];
   if ($zahl == 0){
      return 1;
   }else{
      return ($zahl * &fak($zahl -1));
   }
}


#!/usr/bin/perl
#Aufgabe 13 Rekursion.2
#Berechnet die Summe der Zahlen n + (n-1) + (n-2) + ... + 1

use strict;
use warnings;
use utf8;

{
my $wert;

print "Bitte geben Sie eine Zahl ein >>> ";
chomp($wert=<>);
print "Das Ergebnis lautet: ",&sum($wert),"\n";
}

sub sum($){
   my $zahl=shift @_;
   if ($zahl == 0){
      return 0;
   }else{
   return ($zahl+&sum($zahl-1));
   }
}


#!/usr/bin/perl
#Aufgabe 13 Rekursion.3
#Testet, ob eine Zahl in einer Liste vorkommt

use strict;
use warnings;
use utf8;

{
   my ($result,$eingabe);
   my @numbers = (1,2,3,4);
   
   print "Zahl eingeben >>> ";
   chomp($eingabe = <>);
   
   $result = &in_liste($eingabe,@numbers);
   print "$eingabe kommt in der Liste vor.\n" if ($result == 1);
   print "$eingabe kommt nicht in der Liste vor.\n" if ($result == 0);
}

sub in_liste($@){
   my ($zahl,@liste) = @_;
   if (scalar(@liste) == 0){
      return 0;
   }
   if ($zahl == $liste[0]){
      return 1;
   }
   shift(@liste);
   return (&in_liste($zahl,@liste));
}


#!/usr/bin/perl
#Aufgabe 13 Rekursion.4
#Führt eine Multiplikation zweier Zahlen aus, indem diese auf eine Addition zurückgeführt wird

use strict;
use warnings;
use utf8;

{
my ($wert1,$wert2);

print "Bitte geben Sie zwei Zahlen ein, die Sie miteinander multiplizieren möchten\n";
print "Zahl 1 >>> ";
chomp($wert1=<>);
print "Zahl 2 >>> ";
chomp($wert2=<>);
print "Das Ergebnis lautet: ",&multi($wert1,$wert2),"\n";
}

sub multi($,$){
   my $zahl1=shift @_;
   my $zahl2=shift @_;
   return ($zahl1,0) if $zahl2==0;
   return ($zahl1+(&multi($zahl1,($zahl2-1))));
   }

2. Wir üben die Subroutinen, aber diesmal keine Rekursion, sondern iterative Lösungen.

Lösungen

#!/usr/bin/perl
#Aufgabe 13.5
#gibt jedes zweite Element einer Liste aus

use strict;
use warnings;

{

my @zahlen = (1,2,3,4,5,6,7,8,9,10);

&print_second(@zahlen);

}

sub print_second(@){
   my @liste = @_;
   for (my $i = 1; $i < scalar(@liste); $i = $i+2){
      print "$liste[$i]\n";
   }
}


#!/usr/bin/perl
#Aufgabe 13.6
#dreht die Reihenfolge der Elemente einer Liste um

use strict;
use warnings;

{

my @zahlen = (1,2,3,4,5,6,7,8,9,10);

my @reverse_liste = &my_reverse(@zahlen);

print "@reverse_liste\n";

}

sub my_reverse(@){
   my @liste = @_;
   return (reverse(@liste));
}


#!/usr/bin/perl
#Aufgabe 13.6
#entfernt jedes zweite Element aus einer Liste und dreht die Reihenfolge um

use strict;
use warnings;

{

my @zahlen = (1,2,3,4,5,6,7,8,9,10);

my @zahlen_neu = &del_second(@zahlen);

print "@zahlen_neu\n";

}

sub del_second(@){
   my @liste = @_;
   my @liste_neu;
   for (my $i = 1; $i < scalar(@liste); $i = $i+2){
      unshift(@liste_neu, $liste[$i]);
   }
   return (@liste_neu);
}