neue mit python

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
dfr369
User
Beiträge: 3
Registriert: Sonntag 22. April 2012, 18:51

hallo leute bin relativ neue und unerfahren mit dem programmieren mit python. meine aufgabestellung ist folgendes:

Eine Mersenne-Zahl hat die Form 2n − 1. Schreiben Sie eine Python-Funktion,
die unter Verwendung einer Schleife und bei Eingabe von n die entsprechende
Mersenne-Zahl berechnet.
Wann ist es besser, for-Schleifen statt while-Schleifen zu verwenden?

meine ideen dafur ist.

Code: Alles auswählen

n=int (input("n= "))
# n=2  (zum beispiel)
x=2**n-1
print (x)
ausgabe kommt 3 raus.

ich verstehe nicht warum ich ein for oder while schleife hier einsetzen muss.
kann mir bitte jmd helfen?
Zuletzt geändert von Hyperion am Sonntag 22. April 2012, 22:38, insgesamt 1-mal geändert.
Grund: Quellcode in Python-Code-Tags gesetzt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!

Bitte beachte für zukünftige Posts, dass Du Python-Code in die dafür vorgesehenen Tags packst. In diesem speziellen Fall ist das nicht so tragisch, aber ansonsten gehen Einrückungen verloren, die ja ein essenzieller Bestandteil von Pythons Syntax sind.

Zu Deiner Frage / Deinem Problem:

Du hast die Potenz jetzt via Operator ``**`` ausgedrückt. Ich denke evtl. soll man diese mittels n-facher Multiplikation ausdrücken :K Ich sehe da auch keinen Sinn dahinter, aber evtl. sollt Ihr ja gerade Schleifen lernen und dem Lehrkörper fiel nichts anderes dafür ein ;-) (Wobei ich das nun wirklich nicht für gelungen halte...) Kannst Du uns mal ein wenig Feedback geben, in welcher Institution Du Dich befindest? (Also Schulform, Klasse XY, Uni, Ausbildung, ...)

An sich braucht man für diese Aufgabenstellung keine Schleifen, das hast Du richtig erkannt.

Allerdings ist das bei Dir noch keine Funktion... das musst Du auf jeden Fall noch verändern.

Als Faustregel kannst Du Dir merken: Wenn die Anzahl der Durchläufe von vornherein beschränkt ist, dann nimmst Du am besten eine ``for``-Schleife.

Beachte aber, dass der Umkehrschluss nicht gilt! Es gibt durchaus Fälle, wo man ``for`` auch dann noch verwenden kann oder sogar sollte, wenn die Anzahl von vornherein nicht feststeht (z.B. bei ``itertools.count``). Gilt obige Annahme nicht, dann muss man eben von Fall zu Fall entscheiden, ob nun ``while`` oder ``for`` geeigneter ist.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Wobei ich mir hier auch eine ``while``-Schleife vorstellen kann, wenn man nicht `n`-mal multiplizieren möchte, sondern etwas „schlauer” multipliziert.

Wenn zu der Aufgabenstellung nichts weiter gesagt wurde, hätte ich wahrscheinlich mindestens zwei Lösungen abgegeben wobei eine davon aus einem ``return`` mit der Formel in einer ``while True:``-Schleife bestehen würde. Also die effizienteste Lösung in Python, die trotzdem eine Schleife „verwendet”. :twisted:
dfr369
User
Beiträge: 3
Registriert: Sonntag 22. April 2012, 18:51

ich bin student an der frei universität von berlin (erst semester). bin direkt in den 2 ten teil von AlpII (Objektorientierte Programmierung) reingeplatscht ohne den ersten teil , das im wintersemester 2011-2012 angeboten wurde,gemacht zu haben .es möge blöd von mir kommmen , aber ich frage es trotzdem. was fehlt den meines obiges einsatzes damit es zu einer funktion wird .es wäre auch sehr hilfreich wenn jmd mir erklären würde wie ich eine for oder while -schleifen erzeugen kann , die vorlesung drüber liefert war für mich nicht ausführelich genug.
danke im voraus
deets

Wenn du das erste Semester verpasst hast, empfehle ich das durcharbeiten des Python-Tutorials. Da sollten alle deine Fragen geklaert werden.
BlackJack

@dfr369: Arbeite am besten mal das Tutorial aus der Python-Dokumentation durch. Schleifen und Funktionen sind absolute Grundlagen in Python — und imperative Programmiersprachen im Allgemeinen — und werden dort dementsprechend auch behandelt. Bis einschliesslich Abschnitt 4 solltest Du für die vorliegende Aufgabe durcharbeiten.

In dieser/diesen Veranstaltungen wird in der Regel klar gesagt, dass sie keine Programmierkurse in der jeweils verwendeten Programmiersprache sind, sondern dass man die Sprachen selbstständig lernen muss. Es kann hilfreich sein, wenn man das mit anderen Studenten zusammen tut. Viele stehen ja vor einem ähnlichen Problem, wenn sie eine Programmiersprache noch nicht kennen, oder sogar noch nie programmiert haben. Wobei letzteres auf diejenigen, die ALP I gehört haben, natürlich nicht mehr zutrifft. Die haben zumindest schon mal funktionale Programmierung gesehen und angewandt.

Wegen der Schleife würde ich an Deiner Stelle auch noch mal mit einem Tutor sprechen. Du hast ja selbst schon erkannt, dass man die eigentlich gar nicht braucht, also solltest Du klären *warum* die eingesetzt werden soll. Es kann nämlich durchaus sein, dass hier „Wissen” aus ALP I vorausgesetzt wird, zum Beispiel dass dort in der Vorlesung oder in den Übungen diese Aufgabe schon einmal funktional mit Rekursion gelöst wurde, und die jetzt sehen wollen wie ihr diese Rekursion in eine Schleife überführt.

Edit: Ich sehe gerade, dass die Aufgabe noch die Frage „Wann ist es besser, ``for``-Schleifen statt ``while``-Schleifen zu verwenden?” enthält. Da hätte ich auf jeden Fall drei Lösungen abgegeben, jeweils mit Begründung. :-)
dfr369
User
Beiträge: 3
Registriert: Sonntag 22. April 2012, 18:51

danke für deine ehrliche antwort , werde mich dran hängen.
BlackJack

Da der Abgabetermin jetzt schon über eine Stunde vorbei ist, denke ich es verzerrt nicht den Wettbewerb, wenn ich hier mal die drei Varianten unkommentiert als Pascal-Quelltext ablade:

Code: Alles auswählen

Program Mersenne;

Var i: Word;

Function Mersenne1(n:Word) : LongWord;
Begin
  While True Do
    Begin
      Mersenne1 := Pred(1 SHL n);
      Break;
    End;
End;

Function Mersenne2(n:Word) : LongWord;
Var i:Word;
Begin
  Mersenne2 := 1;
  For i := 1 To n Do
    Mersenne2 := Mersenne2 SHL 1;
  Dec(Mersenne2);
End;

Function Mersenne3(n:Word) : LongWord;
Var x: LongWord;
Begin
  Mersenne3 := 1;
  x := 2;
  While n <> 0 Do
    Begin
      If n And 1 = 1 Then Mersenne3 := Mersenne3 * x;
      x := x * x;
      n := n SHR 1;
    End;
  Dec(Mersenne3);
End;

Begin
  For i := 0 To 20 Do
    WriteLn(i:2, ' ', Mersenne1(i), ' ', Mersenne2(i), ' ', Mersenne3(i));
End.
:-)
Antworten