Seite 1 von 2

Verfasst: Mittwoch 12. Dezember 2007, 22:03
von BlackJack
@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

Verfasst: Mittwoch 12. Dezember 2007, 22:12
von BlackVivi
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.)

Verfasst: Mittwoch 12. Dezember 2007, 22:50
von BlackJack
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.

Verfasst: Mittwoch 12. Dezember 2007, 23:02
von BlackVivi
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...)

Verfasst: Mittwoch 12. Dezember 2007, 23:06
von kaytec
@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

Verfasst: Mittwoch 12. Dezember 2007, 23:10
von BlackJack
Jain. Das geht, man hat zwei Namen eingespart aber dafür jetzt `index`. Also letztendlich nur einen Namen eingespart.

Verfasst: Donnerstag 13. Dezember 2007, 00:13
von RauberRacing
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:

Verfasst: Donnerstag 13. Dezember 2007, 01:12
von BlackJack
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]

Verfasst: Donnerstag 13. Dezember 2007, 09:54
von CM
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.

Verfasst: Donnerstag 13. Dezember 2007, 16:20
von RauberRacing
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

Verfasst: Donnerstag 13. Dezember 2007, 16:29
von BlackVivi
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.

Verfasst: Donnerstag 13. Dezember 2007, 16:42
von RauberRacing
Am Anfang heißt halt dass der code der im kurs vorherrscht verdammt primitiv gehalten wird :(

Verfasst: Donnerstag 13. Dezember 2007, 17:12
von BlackVivi
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...)

Verfasst: Donnerstag 13. Dezember 2007, 19:59
von RauberRacing
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

Verfasst: Donnerstag 13. Dezember 2007, 21:54
von Squaller
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...

Verfasst: Donnerstag 13. Dezember 2007, 23:03
von Python 47
Programmieren in der Schule ist sowieso(aus meiner Sicht) unnütz. Warum?

Man kann den Kurs grob in 3 Gruppen einteilen:

1. Die, die sich schon gut auskenn, für die wird es langweilig
2. Die, die keine Interesse haben
3. Die, die es einfach nicht "gebacken" bekommen.

Durch diese Individualität der Gruppen und der Anzahl der Schüler ist es sehr schwer umsetzbar den Schülern ordentlich Programmieren beizubringen. Manchmal liegt es auch an der eigenen Unwissenheit des Lehrers.

Nehmen wir als Beispiel mich. :lol:

Wir hatten ca. 10 Stunden HTML--->Ich schätze ich habe das gleiche Wissen, wie wenn ich ein 50 seitiges Tutorial gelesen hätte.

Wir haben seit ca. 20 Stunden Oberon Pow(Die Sprache hat eine hässliche, umständliche Syntax)--->Was kann ich?Werte einlesen, Texte, Variablenwerte auf Bildschirm ausgeben, simple arithmetische Berechnungen, IF, ELSEIF, ELSE. Das wars.

Verfasst: Freitag 14. Dezember 2007, 01:17
von Leonidas
BlackVivi hat geschrieben:Die Worte "Am Anfang" und "Rekursion" in einem Absatz find' ich schon merkwürdig.
In "The Little Schemer" einem Buch das wie ein Kinderbuch ausschaut ist es in Kapitel 2. Eigentlich lehrt das Buch nur Rekursion.

Bezüglich Python 47s Kommentar zur Sinnhaftigkeit des Programmierens in der Schule: sehe ich nicht ganz so. Denn: in anderen Kursen sieht das doch auch so aus. Nehmen wir Englisch. Nehmen wir Mathe. Keiner würde sagen, dass man die Fächer loswerden kann. In der Praxis ist es schon wahr dass es recht sinnlos ist - vielleicht sollte man wirklich mehr Zeit auf die Konzepte und weniger auf die Implementierung verwenden. Denn die Konzepte sind größtenteils Sprach- und Zeitunabhängig und helfen einem zum Verständnis von Computern, die Implementierung von Programmen ist eigentlich nur ein nettes Add-on ;) In em Fall erwarte ich aber, dass die Theorie anständig gelehrt wird, aber ich will mir gar nicht erst den Lehrplan ansehen um nicht enttäuscht zu werden.

Verfasst: Freitag 14. Dezember 2007, 08:37
von BlackJack
Struktogramme, Flussdiagramme und Oberon klingt danach als wenn der Lehrer irgendwo vor 10 bis 20 Jahren stehen geblieben ist. :-)

Ich weiss nicht ob es immer noch so ist, aber soweit ich mich erinnern kann ist die Qualität des Informatikunterrichts extrem vom Lehrer abhängig, weil die das oft erst nachträglich als Zusatzqualifikation gelernt haben und wahrscheinlich einige auch mussten ohne es wirklich zu wollen.

An unserer Schule gab's da zwei wie Tag und Nacht. Einer war hauptsächlich Erdkunde- und Geschichtslehrer der in den 80ern aus Interesse mit selbsgebastelten Computern anfing, das alles total spannend fand, immer die neuesten Sachen ausprobiert hat und super Unterricht gemacht hat, und der andere war Mathelehrer, den sie "zwangsweise" zur Uni zur Fortbildung geschickt haben, und der echt grauenhaft war. Hatte keine richtige Lust und ausserhalb des Unterrichtsmaterials was er stur abgearbeitet hat, echt Null Ahnung.

Verfasst: Freitag 14. Dezember 2007, 11:10
von Rebecca
Ich haette mit dem Programmieren erst sehr viel spaeter angefangen, wenn es Informatik in der Schule nicht gegeben haette, und ich habe in der Schule auch einiges gelernt.

Klar, Informatik ist eines der Faecher, in dem Schueler mit extrem unterschiedlichem Vorwissen reingehen, und mit klassischem Frontalunterricht ist damit nicht so einfach umzugehen. Gluecklicherweise setzen sich ja so langsam andere Unterrichtsmethoden durch. Wenn man sich ein wenig Muehe gibt, kann man auch die besseren Schueler zwischendurch herausfordern.

Verfasst: Freitag 14. Dezember 2007, 11:13
von BlackVivi
Leonidas hat geschrieben:
BlackVivi hat geschrieben:Die Worte "Am Anfang" und "Rekursion" in einem Absatz find' ich schon merkwürdig.
In "The Little Schemer" einem Buch das wie ein Kinderbuch ausschaut ist es in Kapitel 2. Eigentlich lehrt das Buch nur Rekursion.
Ich denke, dass man da ruhig zwischen Prozeduralem und funktionalem Programmieren unterscheiden darf :3

Zum Thema Informatik in'r Schule:
Hab'ne Menge damals gelernt, jedoch habe ich auch ein riesiges Interesse in dieser Materie. Hab damals den Javakurs mit'n anderem Schüler eigentlich alleine gemacht. Wobei man noch dazu sagen muss: Hab damals'ne Privatschule besucht, dort waren einfach die Möglichkeiten viel besser, weniger Schüler, bessere Geräte usw. Mein Informatikunterricht an'r staatlichen Schule war sehr grauenvoll, außer an meiner Grundschule.

(Unglaublich, aber wahr, 1995 hatte meine Grundschule schon einen Informatiker und Informatikuntterricht, wir hatten damals sogar den Umgang mit Dos gelernt. Wohl auch einer der Gründe, warum ich jetzt so interessiert darin bin)