Ist factorial() keine Funktion?

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
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Hallo Forum,

ich bin wieder mit einer Übung von codecadmy. Bei dieser Übung
Define a function factorial that takes an integer x as input.

Calculate and return the factorial of that number.


Ich habe diese Lösung gefunden (leider konnte ich selbst nicht lösen)

[codebox=python file=Unbenannt.txt]def factorial(x):
result = x
count = x-1
while count > 0:
result = result * count
count = count - 1
return result
print factorial(5)[/code]

Ich verstehe nicht ganz, warum man hier eine Schleife braucht.

*Edit: Ich dachte, dass "factorial" schon integriert in Python war. Dann glaube ich, dass ich schon verstehe.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Übung existiert nicht weil es unbedingt noch eine Implementation von factorial braucht (von der eine in Python "integriert" ist: math.factorial), sondern damit man lernt so einen Algorithmus in Python auszudrücken.

Die Lösung ist übrigens ziemlich hässlich, die while Schleife hat da z.B. nichts zu suchen.
BlackJack

Ich verstehe ja auch nicht warum man eine Schleife braucht. :twisted:

Code: Alles auswählen

from operator import mul


def factorial(n):
    return reduce(mul, xrange(1, n + 1), 1)
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Danke! Der Lehrling soll in diesem Punkt Schleifen lernen. Aber ehrlich gesagt, ist es ein bisschen doof aufgebaut.

@BlackJack, von deiner Lösung verstehe ich Bahnhof. :lol: Dein Code ist ein Stück weit von meinen Kenntnisse.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich dachte eher daran dass eine for Schleife besser angebracht wäre. BlackJacks Code ist im übrigens wesentlich einfacher zu verstehen, wenn man eine zusätzliche Funktion einführt:

[codebox=python file=Unbenannt.txt]def product(xs):
return reduce(mul, xs, 1)

def factorial(n):
return product(range(1, 1+n))[/code]

In Haskell sieht dass ganze übrigens ganz einfach so aus:
[codebox=haskell file=Unbenannt.hs]factorial n = product [1..n][/code]
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Danke DasIch.

Zusätzliche Frage. Ist empfehlenswert irgendwann Haskell zu lernen? Als ich im Sommer angefangen habe Programmierung zu lernen, habe ich über viele Sprachen gelesen. Ich habe mich auf Bauchgefühl für Python und Haskell interessiert und freute mich, dass Python angeblich eine gute Sprache zum lernen ist. Ich habe auch gelesen, dass Haskell ziemlich schwerer ist.

Ich habe keine berufliche Interesse in der Programmierung und mir fehlt Zeit und eine Menge Kenntnisse. Aber ich gehe langsam, macht nichts. Ich möchte jetzt unbedingt viel mehr Python lernen, aber denke auch, dass ich vielleicht nebenbei andere Sprache lernen könnte.

Grüße.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es kommt auf den Anwendungsfall an. Bei stark mathelastigen Aufgaben ist die Ausdrucksstärke von Haskell recht hilfreich, wie du an diesem Beispiel sehen kannst. Für Aufgaben außerhalb der Mathematik finde ich Haskell zu umständlich. Aber du schreibst deinen Code und du solltest die Sprache nehmen, die dir am besten liegt (oder die dir für ein Problem am passendsten erscheint).
BlackJack

Man muss eine Sprache nicht unbedingt lernen um sie am Ende praktisch anzuwenden. Das könnte ich mir für mich persönlich bei Haskell zum Beispiel nicht vorstellen, trotzdem bin ich froh diese Sprache mal gelernt haben zu müssen, weil sie sich so deutlich von prozeduralen, imperativen Sprachen unterscheidet wo alles ”sofort” ausgewertet wird. Es erweitert den Horizont und beeinflusst die Art und Weise wie man in anderen Sprachen programmiert; wie man Probleme sehen kann; und wie man Lösungen strukturieren und formulieren kann.

Wenn jemand von imperativen Sprachen wie Pascal und Java kommt und dann Python lernt, wird er vielleicht nicht so viel Gebrauch von dem Umstand machen das in Python Funktionen auch Werte „erster Klasse“ sind und vom `functools`- und `itertools`-Modul, als wenn er zwischendurch auch mal Haskell gelernt hat. Eine andere funktionale Sprache würde den Zweck vielleicht auch erfüllen, aber die meisten sind nicht so rein funktional wie Haskell, so dass man nicht so stark gezwungen wird, sich auf das ”zustandslose” Konzept einzulassen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Nun es gibt eine ganze Reihe von Sprachen mit denen es sich lohnt sich mal zu beschäftigen. Zum einen weil es Sprachen gibt die recht ungewöhnliche Fähigkeiten haben, zum anderen um über unterschiedliche Paradigmen zu lernen.

Haskell fällt definitiv in die Kategorie der Sprachen die man mal lernen sollte. Es gibt zu Haskell auch kaum ähnliche Sprachen bzw. sind die Sprachen die zu Haskell ähnlich sind nicht wirklich produktiv nutzbar.

Es gibt aber auch wie gesagt andere Sprachen mit denen man sich ebenfalls mal auseinandersetzen sollte. Assembler um einen besseren Einblick zu bekommen darin wie ein Computer funktioniert. C weil soviel grundlegendes darin programmiert ist und sich damit sehr viel Source Code für einen öffnet und verständlich wird. IO um einen Eindruck davon zu bekommen wie OOP ohne Klasse aussieht. Prolog für logische Programmierung. Lisp um sich mit Makros auseinanderzusetzen. Rust und dessen Ownership/Borrowing System was Memory Management auf beeindruckende Weise, über Allocation und Freeing hinaus, löst.

Auf der anderen Seite sollte gesagt sein dass du Jahre damit verbringen kannst nur unterschiedliche Sprachen zu lernen, da kommst du dann an den Punkt an dem du dich mehr mit Programmiersprachen als mit Programmieren beschäftigst. Das kann man sehr spannend finden, muss man aber nicht. Man muss auch nicht zig Sprachen können um irgendwelche Projekte umsetzen zu können. Gerade bei der ersten Sprache würde ich daher empfehlen, sich erstmal nur auf die eine Sprache zu konzentrieren und ein paar Projekte darin umzusetzen, so dass du auch tatsächlich ein Gefühl dafür hast wie es ist tatsächlich zu programmieren, bevor du dich mit anderen Sprachen auseinandersetzt.
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Danke für die Antworten. Dank ihr recherchiere ich über mehrere Sprachen und Ideen. Es kling alles interessant. ;) Ich werde hier irgendwann über Haskell fragen oder um Tips bitten.

Aber besser mache ich mit Python weiter und mal gucken wohin ich mich wende.

Grüße.
Antworten