Silnia, czyli factorial, czyli nudny temat, ale...

Data publikacji: 2017-08-08 | Tagi:

... ale i tak do niego podejdziemy, bo python ma do zaoferowania kilka ciekawych rozwiązań.

Pierwsze rozwiązanie jest jak zwykle najprostsze:

def silnia(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
        
print(silnia(4))

Standardowe, wręcz podręcznikowe podejście do rekursywnego rozwiązania silni.

Następny pomysł to wykorzystanie wbudowanych bibliotek pythona:

import math

print(math.factorial(4))

Nie ma co tu nawet komentować: w standardowym module math od pythona w wersji 2.6 dostępny jest factorial, dzięki któremu mamy, że się tak wyrażę, pozamiatane.

Ostatni potworek to niezbyt czytelne, ale w sumie całkiem pythoniczne wykorzystanie funkcji anonimowych i innych builtinsów:

print((lambda x: reduce(int.__mul__, range(1, x + 1), 1))(4))

A co tu się dzieje, to już tajemnica :). A tak na poważnie - nie ma czym się przerażać - trzeba rozbić na czynniki pierwsze.

Lambda to oznaczenie funkcji anonimowej, czyli nie mającej swojej nazwy i działającej inline.

# przykład funkcji lambda
print((lambda x: x + 8)(2))
10

# ten sam przykład ze zwykłą funkcją
def dodaj_osiem(x):
    return x + 8
    
print dodaj_osiem(2)

Reduce wykonuje operację z pierwszego parametru na liście elementów z drugiego parametru.

# przykład reduce

print(reduce(int.__mul__, [1, 2, 3])))
6

na liście trzech elementów ([1, 2, 3]) został zastosowany operator mnożenia int.__mul__.

Funkcję range chyba każdy zna - generuje nam listę/generator o zadanym zakresie sekwencyjnych argumentów.

Wszystko to zebrane do kupy powoduje, że można zrobić bardzo fajną funkcję liczącą silnię, nie wyglądającą przy tym jak wyrwana z podręcznika programowania dla opornych :).


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: