iterativ programmieren

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
Jess240890
User
Beiträge: 6
Registriert: Freitag 26. November 2010, 20:00

hallo liebe leute,

hoffe ihr könnt mir helfen.
ich muss ein iterativen alghorithmus erstellen um zwei zahlen mal nehmen zu können ohne die produktoperation " * " zu nutzen.
wie soll das gehen 0.o

den rekursiven teil habe ich geschaft:

def mul_rec (m,n):
if m > 0:
return mul_rec(m-1,n) + n
else:
return 0
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code-Tags benutzen!

Kennst du Schleifen? Wenn ja: Benutze eine!
a·b ist doch nichts anderes, als z.B. a b-mal aufzuaddieren.
Jess240890
User
Beiträge: 6
Registriert: Freitag 26. November 2010, 20:00

ja kenne ich, habe schon versucht eine zu erstellen, bin aber noch zu dumm dafür.
könntest du mir vielleicht eine basteln?
wäre sehr lieb von dir

LG
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

"Eine" Schleife bekomme ich hin:

Code: Alles auswählen

for i in range(10):
    print '*'*i

Generell machen wir keine keine Lösungen!
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@Jess240890: Du bekommst das als Rekursion hin, aber nicht als einfache Schleife!? :shock:

Warum habe ich das Gefühl die rekursive Lösung ist irgendwo abgeschrieben und Du bettelst hier so lange mit "ach ich bin ja so dumm" herum, bis Du eine Komplettlösung bekommst!?
Jess240890
User
Beiträge: 6
Registriert: Freitag 26. November 2010, 20:00

diese schleife kriege ich auch hin. aber ohne mal kriege ich das net hin -.-
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

for i in range(m):
    ...
Zwei Zeilen mehr und die loesung ist fertig.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sowas ist eigentlich sehr einfach, ganz ohne Operatoren zu verwenden ginge es z.B. so ;)

Code: Alles auswählen

from operator import add
from itertools import repeat

def mul(a, b):
    return reduce(add, repeat(a, b), 0)
EDIT: Von derdon genanntes Problem behoben durch setzen von `initial` auf 0.
Zuletzt geändert von DasIch am Freitag 26. November 2010, 23:15, insgesamt 1-mal geändert.
Jess240890
User
Beiträge: 6
Registriert: Freitag 26. November 2010, 20:00

hahaha, habe erst jetzt die vorherige antwort gelesen.

die rekursieve loesung habe ich echt alleine hin bekommen, irgenwie hat es geklappt, aber wuerde nicht meine hand aufs feuer legen das ich es noch mal schaffe. war glueck.
aber danke dir, hast mir sehr geholfen.
jetzt wo ich dein beispiel sehe, merke ich dass meine loesung sehr nahr dran war, hatte das return vergessen und verstand net wieso mein programm nicht klappte.

so nun kann ich gelassen schlafen gehen. wuensche dir gute nacht :)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

DasIch:

Code: Alles auswählen

>>> mul(2,0)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 2, in mul
TypeError: reduce() of empty sequence with no initial value
>>> mul(0,2)
0
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die rekursive Lösung ist schon mal ein guter Anfang. Allerdings gelten nur endrekursive Lösungen als iterativ. Daher müssen wir sie umformen. Statt erst den rekursiven Aufruf und dann die Addition auszuführen, muss ein Akkumulator mit dem Ergebnis mitgeführt werden:

Code: Alles auswählen

def mul_iter(m, n, a=0):
    if m > 0:
        return mul_iter(m - 1, n, a + n)
    else:
        return a
Ich persönlich finde die Kombination if/return/else/return jedoch nicht elegant. Das "else" ist redundant. Also entweder if/return/return oder am besten ein if-Ausdruck statt einer if-Anweisung. Ich glaube, ich drehe auch die Bedingung, damit der Funktionsaufruf hinten steht. Meine fertige Version:

Code: Alles auswählen

def mul_iter(m, n, a=0):
    return a if m == 0 else mul_iter(m - 1, n, a + n)
Jetzt musst du nur noch deinem Lehrer glaubwürdig herleiten, warum dies eine gültige iterative Lösung ist.

Stefan

PS: Einen Bonuspunkt (von mir) gibt es, wenn du auch negative Zahlen multiplizieren kannst.
Antworten