problem beim code zu aufsummieren

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

Mittwoch 12. Dezember 2007, 22:03

@BlackVivi: Rekursionsanker ist typischerweise eher die leere Liste:

Code: Alles auswählen

def aufsummieren(xs, n=1):
    if xs:
        return n * xs[0] + aufsummieren(xs[1:], n + 1)
    else:
        return 0
Wobei das in Python natürlich eine ziemlich ineffiziente Lösung ist.

@Squaller: Man kann noch einen Namen einsparen. Entweder `zaehler` oder `x`.

OT: Zwei mögliche Lösungen in Logo:

Code: Alles auswählen

to aufsummieren :zahlen
output apply "sum map [# * ?] :zahlen
end

to aufsummieren :zahlen [:n 1]
output ifelse (emptyp :zahlen) ~
    [0] ~
    [(:n * first :zahlen) + (aufsummieren (butfirst :zahlen) (:n + 1))]
end
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Mittwoch 12. Dezember 2007, 22:12

BlackJack hat geschrieben:@BlackVivi: Rekursionsanker ist typischerweise eher die leere Liste:

Code: Alles auswählen

def aufsummieren(xs, n=1):
    if xs:
        return n * xs[0] + aufsummieren(xs[1:], n + 1)
    else:
        return 0
Wobei das in Python natürlich eine ziemlich ineffiziente Lösung ist.
Ein Tag, an dem man nichts lernst, ist ein verlorener. Vielen Dank :3

(Das's ineffizent ist, merk ich scho, bei einer Liste mit 993 Elementen ist bereits Schluß. Mit PyPy wird's wohl da besser.)
BlackJack

Mittwoch 12. Dezember 2007, 22:50

Nicht wirklich. Ich meinte nicht mal das Rekursionslimit, sondern das bei jedem rekursiven Aufruf mit ``xs[1:]`` die ganze Liste bis auf das jeweils erste Element kopiert wird. Damit "explodiert" der Speicherbedarf völlig unnötig. Funktionale Programmiersprachen, wo seine eine Rekursion eine "natürliche" Lösung wäre, benutzen für Listen in der Regel verkettete Listen und da ist das eine schnelle und speicherschonende Operation.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Mittwoch 12. Dezember 2007, 23:02

BlackJack hat geschrieben:Nicht wirklich. Ich meinte nicht mal das Rekursionslimit, sondern das bei jedem rekursiven Aufruf mit ``xs[1:]`` die ganze Liste bis auf das jeweils erste Element kopiert wird. Damit "explodiert" der Speicherbedarf völlig unnötig. Funktionale Programmiersprachen, wo seine eine Rekursion eine "natürliche" Lösung wäre, benutzen für Listen in der Regel verkettete Listen und da ist das eine schnelle und speicherschonende Operation.
Oh, oki. Hast wohl recht, dasselbe ist mir mal aufgefallen, als ich selber mit verschiedenen Implementationen vom Sieb des Erathosthenes gespielt habe, wenn Listen aufgesplittet oder Elemente gelöscht und hinzugefügt werden, is das'n unglaublicher Speicherfresser.

(Bah, derb' Off Topic wegen mir geworden. Verzeiht...)
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 12. Dezember 2007, 23:06

@BlackJack

man könnte auch beide sparen und xrange nehmen - oder sehe ich dies falsch ?

Code: Alles auswählen


for index in xrange(len(i)):

gruß frank
BlackJack

Mittwoch 12. Dezember 2007, 23:10

Jain. Das geht, man hat zwei Namen eingespart aber dafür jetzt `index`. Also letztendlich nur einen Namen eingespart.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Donnerstag 13. Dezember 2007, 00:13

aha, so sieht man die leute aus seinem kurs wieder :P
erstma @BlackJack glaub ich wars: ich hab heut meine Lösung von dec2bin (du erinnerst dich) vorgestellt.
Bemängelt wurde vom Lehrer verwendung von:

-list()
-.append
-.join
-reversed

schlusskommentar vom Lehrer "ab sofort dürft ihr keine Sachen mehr benutzen die wir im Unterricht noch nicht hatten" (wir sind ja im selben Kurs)

kurz gesagt is es so wie du auf seite 1 geschrieben hast: uns wird das denken verboten

zum thema (hauptsächlich @ squaller):
ich hab das ganze so gelöst:

Code: Alles auswählen

def bindestrichentfernung(isbn):
    isbn_neu = ''
    for i in str(isbn):
        if(i != '-'):
            isbn_neu = isbn_neu + i
    return int(isbn_neu)

def pruefziffer(isbn):
    isbn = bindestrichentfernung(isbn)
    faktor = 1
    ergebnis = 0
    for i in str(isbn):
        ergebnis = ergebnis + faktor*int(i)
        faktor = faktor + 1
    pz = ergebnis % 11
    if (pz == 10):
        pz = 'X'
    return pz
das ganze wäre wie schon erwähnt mit ner Liste weitaus einfacher zu lösen, aber naja hab ich halt maln programm geschrieben ohne zu denken :roll:
BlackJack

Donnerstag 13. Dezember 2007, 01:12

Ich nehme mal an, dass die `replace()`-Methode auf Zeichenketten auch tabu ist?

Allerdings dürfte es wohl im Rahmen sein, wenn Du die unnötige Umkodierung von Zeichenkette nach `int` und dann wieder nach Zeichenkette weglässt.

Der Algorithmus scheint auch einen eigenen ISBN-Standard zu erfinden. Im ISBN-10 Algorithmus sind die Multiplikationsfaktoren absteigend 10 bis 2.

Edit: Die beiden Algorithmen in Haskell:

Code: Alles auswählen

import Char

cleanISBN = map digitToInt . filter isDigit

checksum10 digits = if checksum == 10 then 'X' else intToDigit checksum
    where checksum = 11 - (sum $ zipWith (*) [10,9..] digits) `mod` 11

checksum13 digits = intToDigit $ (10 - sum' `mod` 10) `mod` 10
    where sum' = sum $ zipWith (*) (cycle [1,3]) digits

checksum isbn = let digits = cleanISBN isbn in
    case length digits of
        9  -> checksum10 digits
        12 -> checksum13 digits
        _  -> error "not an ISBN-10 or ISBN-13 without check digit"

testData = ["0-306-40615-", "978-0-306-40615-"]

main = putStrLn $ unlines [x ++ [checksum x] | x <- testData]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 13. Dezember 2007, 09:54

off topic (hoffe ihr vergebt mir)
RauberRacing hat geschrieben:Bemängelt wurde vom Lehrer verwendung von:

-list()
-.append
-.join
-reversed

schlusskommentar vom Lehrer "ab sofort dürft ihr keine Sachen mehr benutzen die wir im Unterricht noch nicht hatten" (wir sind ja im selben Kurs)

kurz gesagt is es so wie du auf seite 1 geschrieben hast: uns wird das denken verboten
Oh je. Davon hört man ja schon beim bloßen Lesen des Tutorials.
Natürlich kann ich verstehen, daß Lehrer alle Leute in einer Klasse mitnehmen wollen, also auch diejenigen ohne besonderes Interesse. Aber diese Einschränkungen gehen schon ein bißchen weit (werde jetzt nicht großartig argumentieren). Vielleicht könnt ihr mit ihm reden. Das ist schwierig, schließlich soll so etwas ja bei keiner Seite ein ungutes Gefühl hinterlassen. Ich wünsche jedenfalls viel Glück beim Kurs!

@BlackVivi: Abgesehen von BJs Kommentar. Rekursion? Mal schauen, wann wir von dem Kurs Fragen zum dem Thema sehen ;-) .

@Squaller: Schon mal nicht schlecht.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Donnerstag 13. Dezember 2007, 16:20

rekursion machen wir so nebenbei
also alles halt fürn nächsten tag rekursiv schreiben usw.
wir sind halt was den stand des gesamtkurses angeht noch ganz am anfang -.- leider
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 13. Dezember 2007, 16:29

RauberRacing hat geschrieben:rekursion machen wir so nebenbei
also alles halt fürn nächsten tag rekursiv schreiben usw.
wir sind halt was den stand des gesamtkurses angeht noch ganz am anfang -.- leider
Die Worte "Am Anfang" und "Rekursion" in einem Absatz find' ich schon merkwürdig. Und Rekursion so "nebenbei" machen oO? Die sind der größte Bestandteil der funktionalen Programmierung. Für das bloße Verständnis von Programmen find' ich es scho wichtig.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Donnerstag 13. Dezember 2007, 16:42

Am Anfang heißt halt dass der code der im kurs vorherrscht verdammt primitiv gehalten wird :(
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 13. Dezember 2007, 17:12

RauberRacing hat geschrieben:Am Anfang heißt halt dass der code der im kurs vorherrscht verdammt primitiv gehalten wird :(
Programmieren hat eigentlich relativ wenig mit Coden zu tun, zumindest find' ich das. Bevor wir uns damals überhaupt an den Computer gesetzt haben, haben wir 2 Wochen lang nur darüber geredet oO!

(2 Wochen heißt in diesem Fall 8 Schulstunden, hauptsächlich halt mit den Paradigmen der Programmierung beschäftigt, ein wenig Geschichte, was ist ein Compiler, was ist dies und das,... Haben ein paar Schreibtischtests gemacht und erst dann konnte man sich an das Coden trauen. VB und sowas kann vllt mit dransitzen und zusammenklicken gelöst werden...)
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Donnerstag 13. Dezember 2007, 19:59

ja das is schon klar
wir sind ja jetzt ca. 3 1/2 monate dran
die ersten wochen haben wir auch nur da gesessen und struktogramme, flußdiagramme etc pp :roll: gemacht.... das war halt verdammt ätzend
aber was ich damit sagen wollt is halt dass wir für die zeit seit der wir jetzt in python schreiben halt total primitiv sind... und bischen eigeninitiative sollt man doch in nem LK voraussetzen können
Squaller
User
Beiträge: 12
Registriert: Mittwoch 21. November 2007, 18:34
Kontaktdaten:

Donnerstag 13. Dezember 2007, 21:54

genau meine meinung...
vor allem bei der bewertung ist das gemein...
naja, ich will den lehrer jetzt nicht schlecht machen,
aber wie er den untericht gestaltet und wie er die noten gibt ist schon nicht so toll...
mit rekursion haben viele in unserm kurs probleme, jedoch wird es als hausaufgabe aufgegeben und am nächsten tag in einer hü abgefragt...
Antworten