Thema: rekursiv sub aufrufen...

Moin.

Also, da wollt ich mal testen, wie schön rekursive Funktionen mit Perl funzen, und was kommt raus.... nischt  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

  </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> #!/usr/bin/perl
sub fak;

print "Fakultät von: ";
$fakultaet=<STDIN>;
chop($fakultaet);
print "nn".&fak($fakultaet)."nn";

sub fak{
         $zahl=$_[0];
         if ($zahl>1) { return $zahl*&fak($zahl-1)}
         else { return 1};
} [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">warum gibt der code immer 1 aus? Egal welche zahl ich eingebe? So ne 0815 fakultäts funktion sollte doch eigentlich funzen...

F.

GPG key 2E1B4257

2

Re: rekursiv sub aufrufen...

Moin,

probier's mal so:

#!/usr/bin/perl

$i=<STDIN>;
chop($i);

sub fak()
{$z=$f=$i;
  while($i>1){$f*=--$i};
  print $f.' ist die fukaltätärätätät von '.$z;
};

&fak;

gruß

matho

3

Re: rekursiv sub aufrufen...

das ist ja nicht rekursiv. mir geht es dabei nicht um das prog. das ist ja 0815-like;), mir geht wes darum, dass es rekursiv net geht. iterativ bekomm ich das schon noch hin  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

trotzdem thx.

F.

GPG key 2E1B4257

4

Re: rekursiv sub aufrufen...

Wie wärs damit  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">sub fak {
   ($_[0]>1)?$_[0]*fak($_[0]-1):1;
}

print fak(6);[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

5

Re: rekursiv sub aufrufen...

Howdy!

Also zuerst einmal, weiß ich nicht, was das :
sub fak; in Zeile 2 soll. Das brauch man nicht in Perl machen, wir sind ja heir nicht bei C.

Ich kann es mir aber auch nicht erklären, wieso der rekrusive aufruf nicht funktionieren sollte.... Ich werde es mal bei mir ausprobieren ...

Life is given...life is taken
and somewhere there between I live my life

6

Re: rekursiv sub aufrufen...

@ hannes

kleine Berichtigung:

sub fak {$_[0]!=0?$_[0]>1?$_[0]*fak($_[0]-1):1:0;};
print fak($i);

Sonst erhälst Du für $i==0 revolutionärerweise als Fakultät 1

gruß

matho

7

Re: rekursiv sub aufrufen...

meines Wissens, ist ist Fakultät von 0 als 1 definiert.

werden dann mal testen, was jannes vorgeschlagen hat.

F.

GPG key 2E1B4257

8

Re: rekursiv sub aufrufen...

gute sache das  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />  nun funzts,thx. Aber wo war dann bei mir der Fehler? Hab dein Beispiel schon verstanden, kann bei mir aber keinen Fehler finden   <img border="0" title="" alt="[Enttäscht]" src="images/icons/frown.gif" /> 

F.

GPG key 2E1B4257

9

Re: rekursiv sub aufrufen...

Dachte auch immer das die Fakultät von 0 ne 1 ist?  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: rekursiv sub aufrufen...

dennoch ein fehler in der version: die fakultät negativer zahlen (und strings und objekten *g*) ist nicht definiert... (zum Glück kenn ich den Scheiß mit Gamma noch nich *g*)

mfG whitehouse

11

Re: rekursiv sub aufrufen...

@dev0:
Dein Fehler liegt in der Zuweisung von $_[0] an $zahl. Da es sich bei den Argumenten um ein Array handelt, muß Du dies so notieren:

my ($zahl)=$_[0];

Bei der Gelegenheit, Variablen innerhalb von Subs immer mit my deklarieren, damit Sie nur innerhalb der Sub gültig sind. Und wie Azrael schon geschrieben hat, gehört sub fak; am Anfang Deines Codes weg  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

cucu
hannes

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

12

Re: rekursiv sub aufrufen...

ok, danke für das erklären meines Fehlers.
Wobei ich das mit dem sub am anfang gut finde. Ist übersichtlicher (bins aus C++ gewohnt) und wenns net schadet...   <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />     <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" /> 

F.
 
  <small>[ 19-03-2002, 22:09: Beitrag editiert von: dev0 ]</small>

GPG key 2E1B4257

13

Re: rekursiv sub aufrufen...

Asche auf mein Haupt......

0!=1

mußt ich echt nachschlagen, das hatte ich nicht mehr im Hirn. Was ich aber bis jetzt nicht gefunden habe: Warum?
Weiß das jemand?

gruß

matho

14

Re: rekursiv sub aufrufen...

Es schadet aber jedem Auge eines Perlprogrammierers *g* ... so schreibt man das einfach nicht  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

15

Re: rekursiv sub aufrufen...

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Zitat:</font><hr /><font size="2" face="Verdana, Helvetica, sans-serif">Original erstellt von matho:
<strong>Warum?
</strong></font><hr /></blockquote><font size="2" face="Verdana, Helvetica, sans-serif">definitionssache!?

@hannes:
warum? es ist doch viel praktischen, wenn man von anfang an weiss, welche subs alles in dem prog vorkommen.

F.

GPG key 2E1B4257

16

Re: rekursiv sub aufrufen...

@dev0:
nun ja ... man schreibt das in Perl eben nicht so .. es produziert zwar keinen Fehler ist aber unsauberer Code in der Perlsytnax .. aber wenn's Dir so besser gefällt ..   <img border="0" title="" alt="[Breites Grinsen]" src="images/icons/grin.gif" />

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

17

Re: rekursiv sub aufrufen...

http://www.phy.uni-bayreuth.de/~btpa25/ … .html#einf
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#!/usr/local/bin/perl -w
sub UNTER;                       # Prototyp
print "Hauptprogrammn";

UNTER;                           # Name allein genügt
sub UNTER {                      # Definition
   print "Unterprogrammn";
}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">ich bin unschuldig    <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />       <img border="0" title="" alt="[Breites Grinsen]" src="images/icons/grin.gif" />   

F.
 
  <small>[ 19-03-2002, 22:30: Beitrag editiert von: dev0 ]</small>

GPG key 2E1B4257

18

Re: rekursiv sub aufrufen...

jaja *g* ... wie gesagt unüblich und sicherlich auch geschmackssache ... vorallem bringts halt nix ...

http://www.perldoc.com/perl5.6/pod/perlsub.html

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

19

Re: rekursiv sub aufrufen...

@ dev0

Daß das Definitionssache ist, sagt mir mein
"Taschenbuch" der Mathematik von ua. Bronstein auch. Ich hätte halt gern gewusst, ob mir jemand sagen kann, warum diese Definition notwendig ist,
bzw. wo ich das nachschauen könnte......

Denn wenn ich schon blöd bin, wüsst ich gern, warum.

gruß

matho

20

Re: rekursiv sub aufrufen...

Nochmal kurz zu dem Thema unsauber zurück zu kommen... Ich verwende selber sub's, so oft ich nur kann. Naja, das ist jetzt übertrieben, aber schon oft. Die Vorteile sind in der Webanwendung nicht sooo ofensichtlich, aber bei richtigen Programmen schon sehr deutlich. Funktionen, die ständig wiederkommen packe ich einfach in eine Sub, anstatt sie ständig wieder neu proggen zu müssen. Außerdem habe ich ein kleines Verzeichnis, in dem ich alle Subs abspeichere. So kann ich über CP die jeweils nötigen leicht einbauen. Ach ein richtiges Package läßt sich daraus machen -> Objektorientiert und so. Weiß ja net, ob ich den Kommentar falsch verstanden habe, aber Subs sind schon hilfreich und stehen für sauberes Programmieren - meines Erachtens.
Gruß Mirko

Wer einen Rechtschreibfehler findet darf ihn behalten.

21

Re: rekursiv sub aufrufen...

@.: Mirko :.
Glaube wir haben uns da falsch verstanden  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />  Natürlich sind subs in der Programmierung mit Perl wichtig und unentbehrlich .. was ich meinte ist dies:

sub bla;

... code ...

sub bla {
   ... irgendwas ...
}

Also ne Sub zu deklarieren und dann wieder mit sub bla aufzurufen .. das ist unnötige (sieh Bsp. ganz oben) ..

cucu
Hannes

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

22

Re: rekursiv sub aufrufen...

HI!

Ja, das ist eben typischer C/Cpp stil. So nach dem motto

int fak(int);

int main  {
  ....
}

int  fak(int fak){
....
}

Aber nah ner Zeit gewöhnt man sich das auch noch ab, da man immer eine Zeile mehr schreiben muss. Und da Perl Coder bekanntlich faul sind, machen sie das nicht.
Und wer zu faul ist lernt (lassen wir das leiber, sonst lynchen mich noch leute wie Gero etc.)

CU az

Life is given...life is taken
and somewhere there between I live my life

23

Re: rekursiv sub aufrufen...

Ok, gebe zu, ich habe mal wieder zu schnell gelesen. *großeeinsicht* War ja auch net bös gemeint. Naja, wenn man sowas bemängelt, könnte man auch anfangen und sagen, Referenzen benutzen, anstatt die Variablen, durch die Gegend zu schieben. Aber sowas laß ich dann lieber, mach ich ja selber net wirklich konsequent *g*. Also dann, allen noch ein fröhliches progen.
Mirko

Wer einen Rechtschreibfehler findet darf ihn behalten.