Rekursive Listenfunktionen

Werbung
lastElement [1,2,3,4] =
=
=
=
lastElement [2,3,4]
lastElement [3,4]
lastElement [4]
4
RekursiveListenfunktionen
• WiebekommenwirdieListeohnedasletzteElement?
– DieElementewerdensolangeineinerneuenListegesammelt,bisdie
ein-elementige Listeerreichtist.
– DiesewirddanndurcheineleereListeersetztundsomitdasletzte
Elemententfernt.
RekursiveListenfunktionen
• WiebekommenwirdieListeohnedasletzteElement?
– DieElementewerdensolangeineinerneuenListegesammelt,bisdie
ein-elementige Listeerreichtist.
– DiesewirddanndurcheineleereListeersetztundsomitdasletzte
Elemententfernt.
withoutLast ::
withoutLast
withoutLast
->
=
=
RekursiveListenfunktionen
• WiebekommenwirdieListeohnedasletzteElement?
– DieElementewerdensolangeineinerneuenListegesammelt,bisdie
ein-elementige Listeerreichtist.
– DiesewirddanndurcheineleereListeersetztundsomitdasletzte
Elemententfernt.
withoutLast :: [a]
withoutLast
withoutLast
-> [a]
=
=
RekursiveListenfunktionen
• WiebekommenwirdieListeohnedasletzteElement?
– DieElementewerdensolangeineinerneuenListegesammelt,bisdie
ein-elementige Listeerreichtist.
– DiesewirddanndurcheineleereListeersetztundsomitdasletzte
Elemententfernt.
withoutLast :: [a]
withoutLast [x]
withoutLast
-> [a]
= []
=
RekursiveListenfunktionen
• WiebekommenwirdieListeohnedasletzteElement?
– DieElementewerdensolangeineinerneuenListegesammelt,bisdie
ein-elementige Listeerreichtist.
– DiesewirddanndurcheineleereListeersetztundsomitdasletzte
Elemententfernt.
withoutLast :: [a]
withoutLast [x]
withoutLast (x:xs)
-> [a]
= []
= x: withoutLast xs
RekursiveListenfunktionen
withoutLast :: [a]
withoutLast [x]
withoutLast (x:xs)
-> [a]
Ungewohnt/komisch
= []
= x: withoutLast xs
• Irgendwieungewohnt,denRestderListedurcheinen
rekursivenAusdruckanzugeben.
• ABER:dieFunktionlieferteineListe!
• Somitwirddasx vorneandasErgebnisdesrekursiven
Ausdrucksangehängt.
RekursiveListenfunktionen
Zusammenfassung
unsereFunktion
*Main>
'h'
*Main>
"ello"
*Main>
'o'
*Main>
"hell"
first "hello"
rest "hello"
lastElement "hello"
withoutLast "hello"
bereitsimplementiert
*Main>
'h'
*Main>
"ello"
*Main>
'o'
*Main>
"hell"
head "hello"
tail "hello"
last "hello"
init "hello"
RekursiveListenfunktionen
SchreibenSieeineFunktion,welchedasi-te ElementeinerListe
zurückgibt.
Hilfe:
- WievieleArgumentebekommtdieFunktionundwasliefertsie
zurück?
- WiekönnenSieeinenZählerimplementieren?
- WasmussichausderListeentfernenumzumgewünschten
Elementzukommen?
RekursiveListenfunktionen
SchreibenSieeineFunktion,welchedasi-te ElementeinerListe
zurückgibt.
returnElement :: [a] -> Int -> a
returnElement (x:_) 0 = x
returnElement (_:xs) n = returnElement xs (n-1)
RekursiveListenfunktionen
SchreibenSieeineFunktion,welchedasi-te ElementeinerListe
zurückgibt.
returnElement :: [a] -> Int -> a
returnElement (x:_) 0 = x
returnElement (_:xs) n = returnElement xs (n-1)
VorimplementierteFunktion
*Main> "hello" !! 1
RekursiveListenfunktionen
• DasSiebdesEratosthenes
Listen– Lazy Evaluation
const N = 10000
var gestrichen: array [2..N] of boolean
for i = 2 to N do
gestrichen[i] = false // Initialisierung des Primzahlfeldes
end
// Siebe mit allen (Prim-) Zahlen i. Der kleinste Primfaktor einer zusammengesetzten
Zahl j kann nicht größer als die Wurzel von j <= n sein.
for i = 2 to sqrt(N) do
if not gestrichen[i] then
print i; ", "; // i ist prim, gib i aus...
for j = i*i to N step i do
gestrichen[j] = true // ...und streiche seine Vielfachen
end
end if
end
for i = sqrt(N)+1 to N do // Gib die Primzahlen größer als Wurzel(n) aus
if not gestrichen[i] then
print i; ", "; // i ist prim, gib i aus
end if
end
SiebdesEratosthenes- PseudoCode
public SieveOfEratosthenes()
{
System.out.println("--Sieve of Eratosthenes--");
//Initialisierung des Arrays (Zeile 1 - 5)
int n = 120000 ;
boolean[] gestrichen = new boolean[n];
for(int i = 0; i < gestrichen.length; i++)
{
gestrichen[i] = false;
}
//Berechnung starten
startSieving(gestrichen);
}
//Sieben und Ausgabe (Zeile 8 - 20)
private void startSieving(boolean[] gestrichen)
{
//Zeile 8
for(int i = 2; i <= (int) Math.sqrt(gestrichen.length); i++)
{
//Zeile 9
if(!gestrichen[i] == true)
{
//Zeile 10
System.out.println(i);
//Zeile 11 - 13
for(int j = i*i; j < gestrichen.length; j = j + i)
{
gestrichen[j] = true;
}
}
}
//Zeile 16 - 20
for(int i = (int)(Math.sqrt(gestrichen.length)+1); i < gestrichen.length; i++)
{
//Zeile 17
if(!gestrichen[i] == true)
{
System.out.println(i);
}
}
}
SiebdesEratosthenes- Java
primNumber = sieve [2 ..]
where
sieve (x:xs) = x:sieve [n | n <- xs, mod n x > 0]
SiebdesEratosthenes- Haskell
• Wirwollendieerstenn-ElementeeinerListe
get
get
get
get
:: Int ->
_ []
=
0 _
=
n (x:xs)=
[a] -> [a]
[]
[]
x:get (n-1) xs
• WirwollenalleElementeabderPositionn
ListenZerlegen
• Wirwollendieerstenn-ElementeeinerListe
get
get
get
get
:: Int ->
_ []
=
0 _
=
n (x:xs)=
[a] -> [a]
[]
[]
x:get (n-1) xs
• WirwollenalleElementeabderPositionn
drain
drain
drain
drain
:: Int ->
0 xs
_ []
n (_:xs)
[a] -> [a]
= xs
= []
= drain (n-1) xs
ListenZerlegen
Zusammenfassung
unsereFunktion
*Main> get 2 "hallo"
"ha"
*Main> drain 2 "hallo"
"llo"
bereitsimplementiert
*Main> take 2 "hallo"
"ha"
*Main> drop 2 "hallo"
"llo"
RekursiveListenfunktionen
• ElementeeinerListeumdrehen
*Main> reverse "regal"
"lager"
• Implementation:
RekursiveListenfunktionen
• ElementeeinerListeumdrehen
*Main> reverse "regal"
"lager"
• Implementation:
rev :: [a] -> [a]
rev []
= []
rev (x:xs) = rev xs ++ [x]
RekursiveListenfunktionen
• ListenähnelneherMengen.
*Main> [1..10]
• BeiTupeln sinddieAnzahlderElementeundderenPositionen
festvorgegeben.
• InTupeln lassensichunterschiedlicheDatentypenspeichern.
*Main> (True, 10, 'a')
Tupel
• FürTupelmit2-Elementen
*Main> fst (True, 'b')
True
*Main> snd (10, False)
False
Tupel- Zerlegen
• WiesiehtesabernunbeiTupelmitbspw.3-Elementenaus?
*Main> :t fst
fst :: (a, b) -> a
first' ::
first'
second' ::
second'
third' ::
third'
Tupel- Zerlegen
• WiesiehtesabernunbeiTupelmitbspw.3-Elementenaus?
*Main> :t fst
fst :: (a, b) -> a
first' :: (a, b, c) -> a
first'
second' :: (a, b, c) -> b
second'
third' :: (a, b, c) -> c
third'
Tupel- Zerlegen
• WiesiehtesabernunbeiTupelmitbspw.3-Elementenaus?
*Main> :t fst
fst :: (a, b) -> a
first' :: (a, b, c) -> a
first' (x, _, _) = x
second' :: (a, b, c) -> b
second' (_, y, _) = y
third' :: (a, b, c) -> c
third' (_, _, z) = z
Tupel- Zerlegen
• AndersalsbeiListenkönnenfürTupelkeinePatternformuliert
werden,beidenennureinTeilderArgumenteangegebenwird.
• UmeinPatternmatch aufeinTupelmit100Argumentenzu
machen,müssendemnachalle100angegebenwerden.
Tupel- Zerlegen
• EinzelneErgebnisse
Prelude> mod 10 3
1
Prelude> div 10 3
3
• MeistalsResultateinesErgebnispaares
*Main> :t divMod
divMod :: Integral a => a -> a -> (a, a)
*Main> divMod 10 3
(3,1)
InteressanteFunktionen
• EinzelneErgebnisse
*Main> minimum [12,0,5,4]
0
*Main> maximum [12,0,5,4]
12
• MeistalsResultateinesErgebnispaares
minMax :: (Ord a) => [a] -> (a,a)
minMax [] = error "list is empty“
minMax xs = (maximum xs, minimum xs)
InteressanteFunktionen
• Alspythagoräisches TripelwerdendreinatürlicheZahlenx,y
undz bezeichnet,diedieGleichungx2 +y2 =z2 erfüllen.
• Dabeigiltx<y <z.
Pythagoräische Tripel
WielangkönnendieSeiteneinesrechtwinkligenDreieckssein?
Pythagoräische Tripel ={(x,y,z)
ℕ3 |x2 +y2 =z2 }
ptriple :: Int -> [(Int, Int, Int)]
ptriple n = [(x, y, z) | x <- [1..n-2],
y <- [x+1..n-1],
z <- [y+1..n],
x^2 + y^2 == z^2]
Pythagoräische Tripel
• Wiekönnenwir2Listenkombinieren,umeineListeausTupel
zugenerieren?
zip'
zip'
zip'
zip'
:: [a]
_ [] =
[] _ =
(x:xs)
-> [b] -> [(a,b)]
[]
[]
(y:ys) = (x,y):zip' xs ys
ZIP
Herunterladen