smalltalk: rekursive methode

W

webraccoon

Hallo Forum,

hoffe, daß mich jemand erhört.
Habe folgende Aufgabe:

"Schreiben Sie eine rekursive Funktion, die die Summe der natürlichen Zahlen von 0 bis zu einer Zahl n berechnet"

meine bisherige Implementation sieht so aus:

sum: anInt
| summe |
summe:=anInt.
( (anInt = 0) ifTrue:[^self]
ifFalse:[summe:= summe + sum:(self-1)] )
^summe.

nur bekomme ich immer folgende Fehlermeldung:#
...ifFalse:[summe:= summe + Argument expected ->sum:(self-1)] )

hat jemand eine Idee, wie ich hier die Methode rekuriv aufrufe und den Rückgabewert aufsummiere?

Danke
webraccoon
 
Ich weiß nicht recht, welche Sprache das ist. Daher erkläre ich nur das Prinzip

Definiere z.B. eine Funktion Aufsummieren

Aufsummieren(n)
Diese liefert 1 zurück, wenn n=1 und ansonsten liefert sie
AufSummieren(n-1) + n zurück.

Achtung, die Funktion ist nur für positive Zahlen definiert.

Hoffe es hilft dir etwas weiter.
vop
 
Hallo,

danke für deine Antwort.
Das Prinzip ist mir, so denke ich, klar. Nur die Umsetzung klappt noch nicht in dieser Sprache. Es handelt sich um die Sprache Smalltalk.

In PHP habe ich diese Funktion bereits erfolgreich implementiert. Smalltalk verhält sich leider etwas anders.

Gruss
webraccoon
 
Jaja, wer lesen kann ist klar im Vorteil :)
Sprache ist also Smalltalk :)

Habe ich noch nicht eingesetzt.
Das Prinzip hilft dir vielleicht trotztdem?

vop
 
webraccoon hat gesagt.:
sum: anInt
| summe |
summe:=anInt.
( (anInt = 0) ifTrue:[^self]
ifFalse:[summe:= summe + sum:(self-1)] )
^summe.
Ich kenne mich noch nicht so aus in Smalltalk, aber sollte da nicht summe statt self stehen?
self ist doch das Objekt, das die Methode (ich mag das Wort "Message" nicht :p) ausführen kann, oder?
Und das ist hier keine Zahl, wenn ich das richtig sehe. Die Zahl ist ja das Argument und der Rückgabewert... ich weiß ehrlich gesagt überhaupt nicht, von welchem Typ self hier ist.

Ich glaub ich würde das ganze so schreiben (kann aber nichts testen, da ich keine Entwicklungsumgebung parat habe).

Code:
sum: anInt
| summe |
summe := anInt.
(summe == 0)
ifFalse: [summe := summe + sum: (summe-1)]
^summe.
Leider kann ich die Syntax nicht prüfen. Wie gesagt, ich arbeite noch nicht lange mit Smalltalk und muss immer erst ausprobieren wo ich nun einen "." setzen muss usw..

Falls ich falsch liege was das self betrifft, wäre ich dankbar, wenn man es mir näher erklären könnte. Insbesondere in Bezug auf dieses Beispiel.
 
Hi,

ja, im Prinzip hast Du recht.
Meine aktuelle Inplementation sieht so aus:

sumUpto: n

| sum |

(n = 0) ifTrue:[^0]
ifFalse:[ sum := sum + (self sumUpto:(n-1))].
^sum.

In dieser Variante wird die Methode schon mal 10 mal aufgerufen, wenn ich sumUpto: 10 ausführe. Der Debugger hat aber noch ein Problem mit: sum + (self sumUpto:(n-1))

Hier scheint die Variable sum die Nachricht + nicht zu verstehen. Die Klasse als Unterklasse von Integer zu implementieren und dann statt sum self einzusetzen hatte noch mehr Probleme zur Folge. ich bin sicher das Problem ist klein.

Gruss
webraccoon
 
webraccoon hat gesagt.:
sumUpto: n
| sum |
(n = 0) ifTrue:[^0]
ifFalse:[ sum := sum + (self sumUpto:(n-1))].
^sum.
Du setzt sum gar nicht auf n, oder?
Wenn der Rückgabewert sich nicht arithmetisch verknüpfen lassen will, gehts vielleicht so:

Code:
sumUpto: n
| sum |
(n = 0) ifTrue:[^0]
        ifFalse:[ sum := (self sumUpto:(n-1))].
^(sum + n).
 
Hi,

ich habe heute morgen herausgefunden wie's geht.
Hatte einen dämlichen Denkfehler drinne:

Wie Du schon sagst muss ich n natürlich berücksichtigen.

Code:
| sum |
^((n = 0) ifTrue:[^0]
        ifFalse:[ sum := n +  (self sumUpto:(n-1))]).

Ich hatte bisher stets die iterative Lösung im Kopf, mit der nämlich sum = sum + irgendetwas ausgeführt wird. Bei der Rekursion muss natüröich der Übergabeparameter summiert werden.

so gehts auf jedenfall.

Gruss
webraccoon
 

Neue Beiträge

Zurück