Rekursio tarkoittaa sitä, että funktio kutsuu itseään. Näin saadaan toistorakenne ilman silmukkaa.
Yleinen rekursiolla määritelty lukujono on Fibonaccin lukujono. $F_1 = 1, F_2 = 1, F_n = F_{n-1} + F_{n-2}$
Pythonissa tämän voi ohjelmoida rekursiivisesti:
def fibonacci(n):
if n == 1:
return 1
if n == 2:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
fibonacci(10)
Pythonissa määritellyistä funktioista voi piirtää kuvaajia matplotlib-kirjastolla:
import matplotlib.pyplot as kuvaaja
# kuvaaja = matplotlib.pyplot
x_lista = []
y_lista = []
def f(x):
return x ** 2
x = -3 # start
while x <= 3: # end
x_lista.append(x)
y = f(x)
y_lista.append(y)
x = x + 0.01
# matplotlib.pyplot.plot(x_lista, y_lista)
# matplotlib.pyplot.grid()
# matplotlib.pyplot.show()
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.grid()
kuvaaja.show()
Ohjelmoi kaksi funktiota, joista toinen laskee kertoman rekursiivisesti ja toinen silmukalla. Kertoma on määritelty $n! = n\cdot(n-1)!$ tai $n! = 1 \cdot 2\cdot \ldots \cdot n$
def kertoma_rekursiivinen(n):
print("funktiota kutsuttiin parametrillä", n)
if n == 1:
return 1
return n * kertoma_rekursiivinen(n - 1)
print(kertoma_rekursiivinen(5))
# 5! = 1*2*3*4*5
def kertoma_silmukka(n):
tulo = 1
for luku in range(1, n + 1):
tulo = tulo * luku
return tulo
print(kertoma_silmukka(5))
Piirrä funktion $f(x)=2x-7$ kuvaaja. Merkitse kuvaajan funktion nollakohta.
import matplotlib.pyplot as kuvaaja
x_lista = []
y_lista = []
def f(x):
return 2 * x - 7
x = 0 # start
while x <= 5: # end
x_lista.append(x)
y = f(x)
y_lista.append(y)
x = x + 0.1
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.plot([3.5], [0], marker="o", markersize=5, color="red")
kuvaaja.grid()
kuvaaja.show()
Piirrä funktion $f(x)=2x-6$ kuvaaja. Onko piste (2,4) suoran piste?
import matplotlib.pyplot as kuvaaja
x_lista = []
y_lista = []
def f(x):
return 2 * x - 6
x = 0 # start
while x <= 5: # end
x_lista.append(x)
y = f(x)
y_lista.append(y)
x = x + 0.1
print("X:n arvolla 0 funktion arvo on", f(0))
print("X:n arvolla 1 funktion arvo on", f(1))
print("X:n arvolla 2 funktion arvo on", f(2))
print("X:n arvolla 3 funktion arvo on", f(3))
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.plot([4], [2], marker="o", markersize=5, color="red")
kuvaaja.plot([5], [3], marker="o", markersize=5, color="red")
kuvaaja.grid()
kuvaaja.show()
if f(4) == 2:
print("piste on kuvaajalla")
else:
print("ei oo kuvaajalla")
Funktio f(x) kuvaa sähkönkulutusta Suomessa (kWh). Missä muuttuja x on kulunut aika vuosissa vuodesta 1970. Piirrä funktion kuvaaja.
import matplotlib.pyplot as kuvaaja
x_lista = []
y_lista = []
def f(x):
return -1.3 * x ** 3 + 58.8 * x ** 2 + 1349.4 * x + 21583
x = 0 # start
while x <= 44: # end
x_lista.append(x)
y = f(x)
y_lista.append(y)
x = x + 0.1
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("Aika, vuosi 1970=0")
kuvaaja.ylabel("Sähkönkulutus (GWh)")
kuvaaja.plot([0], [f(0)], marker="o", markersize=5, color="red")
kuvaaja.plot([30], [f(30)], marker="o", markersize=5, color="red")
kuvaaja.grid()
kuvaaja.show()
print("sähkönkulutus on 1970", f(0))
print("sähkönkulutus on 2000", f(30))
Pesäpallon lentoa kuvaa pystysuunnassa funktio h(t), missä h on pallon korkeus (m) ajan t (s) funktiona. Laske milloin pallo osuu takaisin maahan ja piirrä korkeusfunktion h(t) kuvaaja.
import matplotlib.pyplot as kuvaaja
x_lista = []
y_lista = []
def h(t):
return 1.7 + 14.7 * t - 4.9 * t ** 2
def d(t):
return 31.5 * t
t = 0 # start
while h(t) >= 0: #end
x_lista.append(d(t))
y_lista.append(h(t))
t = t + 0.01
print("pallo osuu maahan kun t=",t)
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("Pituus (m)")
kuvaaja.ylabel("Korkeus (m)")
#kuvaaja.plot([0], [f(0)], marker='o', markersize=5, color="red")
#kuvaaja.plot([30], [f(30)], marker='o', markersize=5, color="red")
kuvaaja.grid()
kuvaaja.show()
print("h on hetkellä 0", h(0))
print("h on hetkellä 2", h(2))
print("d on hetkellä 0", d(0))
print("d on hetkellä 1", d(1))
print("d on hetkellä 2", d(2))