Anfängerprobleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pc_doctor
User
Beiträge: 3
Registriert: Montag 21. April 2014, 16:28

Hallo Forum,
ich habe mich erst grade angemeldet und beschäftige mich aufgrund meines Informatikstudiums seit einer Woche mit Python.
Zuvor hatte ich an der Uni Haskell gelernt.

Um ein wenig warm zu werden mit Pyhton programmiere ich vor mich hin; soll heißen:
Bezüglich der Tradition eines jeden Programmieres ein Hello-World Programm :)
Taschenrechner etc.

Nun, da wir in Haskell sehr viel mit Listen gearbeitet haben und Haskell in dieser Hinsicht sehr flexibel war, möchte ich auch Listen in Python behandeln.

Sagen wir mal , ich habe folgende Liste l=[1,2,3,4]

Ich möchte jetzt rekursiv die Summe der Liste haben (1+2+3+4 = 10)
Außerdem würde ich gerne iterativ die Summe berechnen lassen, da ich den Unterschied in Pyhton verdeutlichen möchte.

Also :

Code: Alles auswählen

def summelist(l):
      if l == 0 :         # hier weiß ich nicht , ob NIL oder 0 .Es soll geprüft werden, ob die Liste leer ist.
               return 0
       else:
            return l[0]+summelist(l)
Das ist das rekursive, bin mir leider nicht sicher, ob es richtig ist.

Iterativ:

Code: Alles auswählen

def summelist(l)
           if l == 0:
                return 0
           else:
                 return l[0]+l[1]+l[2]+l[3]
Ich hoffe, jemand könnte die beiden Funktionen mal überprüfen.
Vielen Dank im Voraus und frohe Ostern !
Zuletzt geändert von Anonymous am Montag 21. April 2014, 16:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@pc_doctor: Beide Lösungen sind offensichtlich falsch. Und es ist sicher nicht zielführend ohne Kenntnisse wie Listen in Python funktionieren, nämlich deutlich anders als in Haskell, zu versuchen Haskell in Python-Syntax zu schreiben. Listen werden in Python zum Beispiel *nicht* als rekursiver Datentyp definiert wie in Haskell, weswegen eine rekursive Lösung hier unsinnig und sehr ineffizient ist. Man kann sich von Python-Listen nicht effizient den „tail” von einer Liste geben lassen. Dazu muss man sich eine *Kopie* der Liste ohne das erste Element geben lassen. Das läuft auf eine quadratische Laufzeit hinaus, für eine eigentlich lineare Operation.

Wenn Du für eine rekursive Lösung auf die leere Liste prüfen willst, dann muss da weder mit 0 noch mit NIL (was es in Python nicht gibt) verglichen werden, sondern mit der leeren Liste. Das würde man an der Stelle in Haskell doch auch machen‽

Und beim rekursiven Aufruf muss man die Liste ohne das erste Element übergeben. Sonst bleibt die Liste doch bei jedem Aufruf gleich lang und man kommt nie beim Rekursionsanker, der leeren Liste an.

Bei der iterativen Lösung braucht man die Liste auf gar nichts prüfen. Aber man braucht eine Schleife die über die Elemente iteriert, denn sonst ist es keine iterative Lösung. Deine kommt ja nur mit Listen klar die genau vier Elemente enthalten.

Die praxisrelevante Lösung für diese Aufgabe wäre einfach die vorhandene, eingebaute `sum()`-Funktion zu verwenden:

Code: Alles auswählen

In [17]: values = [1, 2, 3, 4]

In [18]: sum(values)
Out[18]: 10
Bevor Du versuchst Haskell auf Python zu übertragen, solltest Du am besten erst einmal die Grundlagen von Python lernen, damit Du ein Verständnis vom Ziel einer solchen Portierung hast. In der Python-Dokumentation ist ein Tutorial, und absoluten Programmieranfängern wird oft Learn Python The Hard Way empfohlen. Falls Du bisher nur Haskell kennst, dürftest Du in dem Sinne noch als absoluter Anfänger gelten, denn rein funktionale Programmiersprachen funkionieren *deutlich* anders als imperativ, objektorientierte Programmiersprachen. Auch wenn Python das funktionale Paradigma bis zu einem gewissen Grad unterstützt.

Wenn es `sum()` zum Beispiel nicht gäbe, könnte man sich das im funktionalen Stil aus `reduce()` und `operator.add()` zusammen basteln:

Code: Alles auswählen

In [20]: import operator

In [21]: reduce(operator.add, values, 0)
Out[21]: 10
`reduce()` ist also so ähnlich wie `foldl` aus Haskell.
pc_doctor
User
Beiträge: 3
Registriert: Montag 21. April 2014, 16:28

Hallo BlackJack, vielen Dank für deine Hilfe.

Ich hatte vorher auch andere Sprachen ( auch objektorientierte ). Stimmt schon, dass ich das nicht mit Haskell vergleichen kann.

Ich werde mir mal den Link anschauen, danke nochmal.
Antworten