Freunde innerhalb eines bestimmten Grades der Trennung erreichen

8

alles. Ich bin ein sehr, sehr neuer Programmierer. Meine Sprache der Wahl ist momentan Python und ich habe das Gefühl, dass ich ein gutes Gefühl dafür habe. Ich lerne gerade erst von Rekursion. (Übrigens, wenn jemand eine gute Anleitung dazu empfehlen könnte, lass es mich wissen!) Nur, damit ihr alle wisst, diese Frage ist sehr elementar und der Code, den ich poste, ist furchtbar, entsetzlich falsch.

Jedenfalls versuche ich eine Funktion zu schreiben, die alle Freunde innerhalb eines bestimmten Grades bekommt. Wenn ich es als Grad 0 gebe, will ich nur mich. Wenn ich es gebe 1, will ich mich und alle meine Freunde. 2, ich will mich, meine Freunde und all ihre Freunde und so weiter.

Ich habe schon eine ganze Reihe von Möglichkeiten ausprobiert, aber keine funktioniert. Ich versuche mir vorzustellen, wie es in der Theorie funktionieren soll, und ich kann das auch nicht ganz verstehen, weil ich auf diesem Gebiet so unerfahren bin. Vielleicht kann eine freundliche Seele mir hier alle Möglichkeiten aufzeigen, wie dieser Code versagt, und dann erklären, wie man es richtig macht und / oder eine gute Anleitung zu diesem Thema empfiehlt. Hier geht es:

%Vor%

Es funktioniert nicht, und ich weiß, dass ich dumme, dumme Sachen gemacht habe. Jemand bitte mich ohrfeigen und mir in die richtige Richtung zeigen!

Danke.

    
Garrett 31.05.2009, 05:00
quelle

5 Antworten

13
%Vor%

Dies setzt friendList auf None , bedingungslos, da dies der unveränderliche Rückgabewert der Methode append einer Liste ist - also, dass Seltsamkeit zuerst ...! -)

Sobald Sie das behoben haben, müssen Sie die Funktion noch so anpassen, dass sie immer mit return von etwas endet - "vom Ende fallen" gibt None zurück. Zum Beispiel:

%Vor%

das kann und sollte klar umgestaltet werden, um die Vervielfältigung zu beseitigen (TROCKEN, wiederhole dich nicht, ist DAS Herz der Programmierung ...):

%Vor%

PS: das (die alist=alist.append(...) issue) genau wie ich 2002 wieder mit meiner Frau Anna in Kontakt kam (wir waren vor vielen Jahren nicht ganz so gute Freunde gewesen, hatten aber verloren Sie fing an, Python zu studieren, benutzte genau dieses fehlerhafte Konstrukt, konnte nicht verstehen, warum es fehlschlug - sich in der Python-Gemeinschaft umgeschaut, meinen Namen gesehen und erkannt, mir eine Mail geschickt und danach gefragt ... weniger als zwei Jahre später waren wir verheiratet, und bald darauf war sie die erste Frau Mitglied der Python Software Foundation und mein Co-Autor in "Python Cookbook" 2. Auflage. Also, natürlich habe ich einen unglaublichen Sweet Spot für diesen speziellen Python-Fehler ... ;-).

    
Alex Martelli 31.05.2009, 05:13
quelle
1

Ist Ihre Identität korrekt? Der Hauptteil der Methode sollte relativ zur Definition

eingerückt sein     
artemb 31.05.2009 05:13
quelle
1

Sie können friendList.append (self) in die Zeile vor dem if verschieben - Sie brauchen es in beiden Fällen. Sie müssen das Ergebnis auch nicht der Friendlist zuweisen - es ist ein Bug.

In Ihrem Algorithmus werden Sie wahrscheinlich dieselben Personen zweimal hinzufügen - wenn A ein Freund von B ist und B ein Freund von A. Sie müssen also eine Gruppe von Freunden behalten, die Sie bereits verarbeitet haben. Überprüfen Sie vor der Verarbeitung dieses Set und tun Sie nichts, wenn die Person bereits verarbeitet wurde.

    
Igor Krivokon 31.05.2009 05:10
quelle
1

Es gibt keine return -Anweisung in der else -Klausel. Wenn also degree != 0 ist, gibt diese Methode immer None zurück. Sie möchten das Ergebnis jedes rekursiven getFriends -Aufrufs an Ihre friendList anhängen und dann friendList zurückgeben.

Übrigens, wenn Sie diesen Algorithmus schneller machen wollen, gibt es gut etablierte Methoden, um dies entweder mit Graphalgorithmen oder Matrixmanipulation zu tun. Wenn Sie beispielsweise Freundschaftsbeziehungen mit einer Adjazenzmatrix A darstellen und alle Personen finden möchten, die sich in n voneinander unterscheiden, können Sie B=A^n berechnen. Wenn B[i][j] > 0 , dann sind i und j innerhalb von n voneinander separiert. Matrix Multiplikation ist einfach mit einem Paket wie NumPy .

    
RexE 31.05.2009 05:38
quelle
1

(Entschuldigung, ich kann Alex 'Antwort nicht kommentieren ... noch )

Ich mag die Idee nicht wirklich, dass getFriends einen Wert zurückgibt, der nie benutzt wird. Es funktioniert, aber es sieht ein bisschen faszinierend aus;) Der erste Aufruf von getFriends wäre self.getFriends (degree, []), was verwirrend ist: Wenn Sie eine Liste von Freunden erhalten, warum würden Sie als Argument eine leere Liste übergeben, richtig?

Aus Gründen der Übersichtlichkeit denke ich, dass ich diese etwas andere Version mit der Helferfunktion _getFriends bevorzugen würde:

%Vor%     
NicDumZ 31.05.2009 07:30
quelle

Tags und Links