Testvorbereitung 3.Test SS10

  • ich glaub habe ich immer wieder Verständnis Problem mit der Rekursion. Habt ihr selbst Bsp. RekursionMobile ausprogrammiert? Wer kann mit bitte helfen um diese lustige void balance() Methode verstehen zu können?

    PHP
    1. public void balance() {
    2. left.balance();
    3. right.balance();
    4. attachPos = ((double) width*right.getWeight())/this.getWeight();
    5. }

    in der Tat macht balance() "nichts", aber trotzdem wird sie rekursiv aufgerufen...Wie funktioniert das Ganze kann nicht nachvollziehen :wein: :wein:



    Ich bin zwar kein Tutor, aber stell dir das ganze als Baum vor: Beim Aufruf von void balance() ist man bei der Wurzel, danach steigt man gleichzeitig zum linken, als auch zum rechten "Knoten" hinab. Du hast also zwei Funktionen die sich "öffnen". Diese "öffnen" im nächsten Schritt wiederum zwei Funktionen, insgesamt sind also 4 offen usw.. Erst wenn man bei den Blättern des Baumes angelangt ist, beginnen sich die Funktionen mittels dem setzen von attachPos wieder zu "schließen", bis letztendlich alle Knoten (in dem Fall MobileTeile) ausbalanciert sind. Denn laut Angabe ist ein Mobile ja nur vollständig ausbalanciert, wenn alle Teile ausbalanciert sind. Und das gewährleistet dieser rekursive Aufruf.


    Dies ist finde ich ein etwas schweres Beispiel zum Vorstellen/Nachvollziehen von Rekursion, da gibt es auch andere. Ich hoffe ich konnte dir ein wenig helfen..


    Lg

  • Und jetzt stell dir mal statt dem Binärbaum ein Mobile vor (weil das ist ja im Prinzip das gleiche, dann hast du noch einen viel besseren vergleich)


    Und zur Formel:
    linker Abstand sei a:
    Gewicht links sei h:
    rechter abstanst sei b:
    Gewicht rechts sei x
    a*h = b*x


    Nun ist w = a + b (wir kennen nur w, a und b sind unbekannt)
    b = w - a


    a*h = w*x - a*x
    a*h + a*x = w*x
    a (h+x) = w*x
    a = (w*x)/(h+x)


    Und damit hast du auch die obige Formel

    "The quieter you become, the more you are able to hear."
    -------------------------------------------------------------------------------------

  • könnte mir vlt. jemand helfen, was this in folgendem Fragment konkret bedeutet? Phrase ist von Bsp. Train

    PHP
    1. public class Car {
    2. // Datenelemente...
    3. protected Car next;
    4. public void connectTo(Car previous) {
    5. if (previous != null) {
    6. previous.next = this;
    7. }
    8. }
    9. }


    Vielen Dank.

    Code
    1. if(postWaiting < geduld) ich = Synchroner;else ich = Asynchroner;

    :)

  • In der Car Klasse hast du ein Car das "next" heißt .. Dh. Jeder Wagon eines Zuges hält eine Variable in der der nachfolgende Wagon enthalten ist ..
    Das ist viell. mit "babushka"s zu vergleichen (Das sind die russishen holz-oma-puppen die ineinander stecken.. )!


    Die Klasse Car bietet nun eine methode die es erlaubt wagone zu verbinden .. du führst den vorgang auf dem neuen wagon aus ->
    dh. du übergibst dem neuen wagon zunächst seinen "vorläufer" wagon, dafür steht dir die methode connectTo zur Verfügung.
    Wagone speichern jedoch hier nur nachfolgende wagone und nicht vorläufer
    .. dh. du musst eigentlich in dem vorläufer den aktuellen wagon speichern .. dh. das objekt .. sich selbst ..


    und genau das meint das this ... this.. soviel wie das objekt selbst ..


    hoffe es ist einiger maßen verständlich ..


    lg

  • hmmm ganze geschichte war eigentlich klar, wollte wissen nur wie kann ich mir this vorstellen. z.B. super stellen alle Datenelemte/Konstruktoren der Basisklasse zur Verfügung, fall sie ohne private sind. This ist teilweilse klar, aber was macht genau in diesem Bsp. kann leider noch ned mir vorstellen

    Code
    1. if(postWaiting < geduld) ich = Synchroner;else ich = Asynchroner;

    :)

  • this meint das konkrete objekt ..
    .. du führst die methode connecTO ja auf einem ganz bestimmten car aus .. das hat bestimmte eigenschaften die du in die variablen schreibst ..
    z.b. ein roter porsche..


    also ganz primitiv machst ..


    Car porsche = new Car();
    porsche.typ = "auto"; //der einfachheit halber!
    porsche.farbe = "rot";
    porsche.marke = "porsche";


    und dann sagst du z.b.


    Car anhänger = new Car(); // im echten code ohne ä sonst streikt java wieder
    anhänger.typ = "anhänger";
    anhänger.achse = "eine";


    um den anhänger jetzt am porsche "anzuhängen" (laut dem code da oben ) sagst du :
    anhänger.connectTO(porsche);


    und jetzt steht in der methode folgendes drinen:
    if(porsche !=0) // ergibt true da wir das objekt erzeugt haben mit "new Car()"
    porsche.next = anhänger; //anhänger ist also indem fall das this .. das objekt .. auf dem die methode ausgeführt wird..



    dann bekommst du folgendes ergebnis ..


    porsche.next.typ // liefert "anhänger"
    porsche.next.achse // liefert "eine"


    dh. im porsche objekt hast du das komplette anhänger objekt gespeichert .. in der variable "next" ..
    jetzt könntest du einen zweiten anhänger machen den du an den ersten dranhänst ..
    dann rufst du auf:
    anhänger2.connectTo(anhänger);


    und kannst ihn dann accessen über:
    anhänger.next..
    oder
    porsche.next.next."whatever" // typ, achse .. etc.


    da die variable "next" im objekt per default "null" ist .. kannst du also alle Car's z.b. mittels einer while schleife bekommen ..
    die holt immer mittels .next den nächsten bis einer keinen mehr hat..
    also "while (car.next != null)"
    car = car.next;
    System.out.println(car.toString());


    hoffe s hilft.. lg