# smalltalk: rekursive methode



## webraccoon (16. Juni 2005)

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 + sumself-1)] )
^summe.

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

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

Danke
webraccoon


----------



## vop (17. Juni 2005)

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

Definiere z.B. eine Funktion Aufsummieren

Aufsummieren
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


----------



## webraccoon (17. Juni 2005)

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


----------



## vop (17. Juni 2005)

Jaja, wer lesen kann ist klar im Vorteil  
Sprache ist also Smalltalk 

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

vop


----------



## vop (17. Juni 2005)

Fehlen da vielleicht einfach nur Klammern beim Funktionsaufruf?

vop


----------



## mueslirocker (19. Juni 2005)

webraccoon hat gesagt.:
			
		

> sum: anInt
> | summe |
> summe:=anInt.
> ( (anInt = 0) ifTrue:[^self]
> ...


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 ) 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).


```
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.


----------



## webraccoon (19. Juni 2005)

Hi,

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

sumUpto: n

| sum |

(n = 0) ifTrue:[^0]
        ifFalse:[ sum := sum +  (self sumUpton-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 sumUpton-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


----------



## mueslirocker (20. Juni 2005)

webraccoon hat gesagt.:
			
		

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


Du setzt sum gar nicht auf n, oder?
Wenn der Rückgabewert sich nicht arithmetisch verknüpfen lassen will, gehts vielleicht so:


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


----------



## webraccoon (20. Juni 2005)

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.


```
| 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


----------

