flowchart TD
F5["fib(5)"] --> F4["fib(4)"] & F3a["fib(3)"]
F4 --> F3b["fib(3)"] & F2a["fib(2)"]
F3a --> F2b["fib(2)"] & F1a["fib(1)"]
F3b --> F2c["fib(2)"] & F1b["fib(1)"]
Αναδρομή
Βασική περίπτωση (τερματίζει) + αναδρομικό βήμα (καλεί τον εαυτό της, για μικρότερο υποπρόβλημα).
Πρώτα, μόνο η βασική περίπτωση — δουλεύει μόνο για n=0:
Προσθέτουμε το αναδρομικό βήμα — τώρα δουλεύει για κάθε n:
Χωρίς βασική περίπτωση → RecursionError. Επικαλυπτόμενα υποπροβλήματα → εκθετικός χρόνος.
fib(5)flowchart TD
F5["fib(5)"] --> F4["fib(4)"] & F3a["fib(3)"]
F4 --> F3b["fib(3)"] & F2a["fib(2)"]
F3a --> F2b["fib(2)"] & F1a["fib(1)"]
F3b --> F2c["fib(2)"] & F1b["fib(1)"]
fib(3) ×2, fib(2) ×3 — οι επικαλύψεις πολλαπλασιάζονται εκθετικά.
functools.lru_cacheΟ decorator “θυμάται” αποτελέσματα ήδη υπολογισμένων κλήσεων.
yieldΠαράγει τιμές τεμπέλικα (lazily) — μία-μία, κατ’ απαίτηση.
flowchart TD
A["38 27 43 3 · 9 82 10"] --> B["38 27 43 3"] & C["9 82 10"]
B --> D["38 27"] & E["43 3"]
C --> F["9"] & G["82 10"]
D & E --> BM["3 27 38 43"]
F & G --> CM["9 10 82"]
BM & CM --> AM["3 9 10 27 38 43 82"]
Κάτω: χώρισε στη μέση. Πάνω: συγχώνευσε ταξινομημένα.
Διαίρει, λύσε αναδρομικά, συγχώνευσε — γραμμή προς γραμμή:
Τώρα, εκτελέσιμο:
Στην Εβδομάδα 8 είχαμε μόνο τύπους για \(2\times2\)/\(3\times3\). Γενικά:
\[ \det(A) = \sum_{j=0}^{n-1} (-1)^{j} A_{0j} \det(M_{0j}) \]
Πρώτα, μόνο η βασική περίπτωση — πίνακας \(1\times1\):
Προσθέτουμε το αναδρομικό βήμα — τώρα δουλεύει για κάθε \(n\):
Μία συνάρτηση αντικαθιστά μια άπειρη οικογένεια τύπων — έναν ανά μέγεθος πίνακα.
\(T_n = 2T_{n-1}+1 \Rightarrow T_n = 2^n - 1\).
Η στοίβα κλήσεων της Python αντικαθιστά τη ρητή στοίβα της Εβδομάδας 5.
RecursionError, εκθετική επανάληψη υπολογισμώνlru_cache), γεννήτριες (yield)⤺ Πλήρεις σημειώσεις · Πρόγραμμα μαθήματος
Τμήμα Μαθηματικών, ΕΚΠΑ