Tiefensuche

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Also wir haben in der Uni grad ein Projekt zur Erstellung von Facebook, werkeln also fleißig dran. Eine der Aufgabe war die Tiefensuche mit einer Methode zu implementieren. Jedoch bin ich dabei auf ein idiotisches Problem gestoßen.

    Das Problem ist folgendes:
    Die Suche klappt wunderbar, er springt von Freundesliste zu Freundesliste und sucht nach einem Profil, dass mit dem gesuchten befreundet ist. Das Problem ist hier, dass beim letzten Schritt, als er endlich auf einem Profil ist, das mit dem gesuchten befreundet ist, gibt er mir statt dem true; aus der ersten if()-Anweisung, sondern überprüft es erst gar nicht und springt direkt zum return false; Warum das?

    Quellcode

    1. public boolean areConnected(PersonProfile from, PersonProfile to) {
    2. if(from.isBefriendedWith(to)) {
    3. return true;
    4. }
    5. for (PersonProfile friend : from.getFriends()) {
    6. if (!friend.getVisited()) {
    7. from.setVisited(true);
    8. from = friend;
    9. areConnected(from, to);
    10. }
    11. }
    12. return false;
    13. }
    Alles anzeigen
  • Warum schreibst du
    from.setVisited(true);
    in das if? Ich würde es eher an den Anfang der Methode schreiben.

    Warum setzt du überhaut .setVisited(true) direkt an das Profil, obwohl das nur für deine kleine Suche relevant ist? Was ist wenn man danach nochmal suchen will oder zwei Suchen parallel stattfinden sollen?

    Du rufst zwar
    areConnected(from, to);
    im if auf, machst aber rein garnichts mit dem boolean-Rückgabewert der Methode.

    from = friend;
    Diese Zuweisung scheint mir falsch zu sein. Das würde ich ganz schnell wegmachen und statt
    areConnected(from, to);
    lieber
    areConnected(friend, to);
    schreiben.
  • Danke für die Hilfe.
    Ich habs berücksichtigt. Habe dazu noch eine Hilfsfunktion eingefügt. Aber auf den wichtigsten Punkt, mit der var res, bin ich durch einen Freund gekommen. Aber das mag ich ja an Proggen, man hält sich selten an schwierigen Sachen auf, sondern immer an den Kleinigkeiten :D
    Klappt jetzt wunderbar. Danke nochmals.
    mfg Wasilij.

    Quellcode

    1. public boolean areConnected(Person p1, Person p2) {
    2. boolean res = false;
    3. if (p1 != null && p2 != null) {
    4. if (areFriends(p1, p2)) {
    5. res = true;
    6. } else {
    7. res = areConnectedR(getProfile(p1), getProfile(p2));
    8. }
    9. }
    10. return res;
    11. }
    12. private boolean areConnectedR(PersonProfile from, PersonProfile to) {
    13. boolean res = false;
    14. if (from.isBefriendedWith(to)) {
    15. res = true;
    16. } else {
    17. from.setVisited(true);
    18. for (PersonProfile friend : from.getFriends()) {
    19. if (friend.isVisited()==false) {
    20. res = areConnectedR(friend, to);
    21. }
    22. }
    23. }
    24. return res;
    25. }
    Alles anzeigen
  • Aber auf den wichtigsten Punkt, mit der var res, bin ich durch einen Freund gekommen.
    Was denkst du denn was ich damit gemeint habe:
    Du rufst zwar
    areConnected(from, to);
    im if auf, machst aber rein garnichts mit dem boolean-Rückgabewert der Methode.


    Das ist nach wie vor so:
    Warum schreibst du
    from.setVisited(true);
    in das if? Ich würde es eher an den Anfang der Methode schreiben.


    Das auch:
    Warum setzt du überhaut .setVisited(true) direkt an das Profil, obwohl das nur für deine kleine Suche relevant ist? Was ist wenn man danach nochmal suchen will oder zwei Suchen parallel stattfinden sollen?


    Das hier ist immer noch falsch:

    Quellcode

    1. for (PersonProfile friend : from.getFriends())
    2. {
    3. if (friend.isVisited()==false)
    4. {
    5. res = areConnectedR(friend, to);
    6. }
    7. }
    Die Vareable res wird immer wieder überschrieben somit wird nur der letzte Freund in der for-Schleife berücksichtigt.

    friend.isVisited()==false schreibt man üblicherweise einfach !friend.isVisited()