minimum einer Zahlenfolge?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ja, du kannst linear rekursiv arbeiten und das erste Element der Liste mit dem rekursiven Aufruf der restlichen Liste vergleichen.

Du kannst aber auch, statt immer linear zu kürzen, die Liste halbieren und rekursiv das Minimum dieser Sublisten ermitteln. Sobald eine Liste nur noch ein oder zwei Elemente besitzt, gibst du dann eben das Minimum davon zurück.

Dieses Minimum der Sublisten vergleichst du dann und gibst das kleinere zurück.


Jathe677 
Fragesteller
 24.01.2022, 13:51

Danke erstmal für die Antwort. Wie notiere ich , wenn ich eine Liste halbieren will (bzw wie erreiche ich das, mit einer for schleife?)und wenn ich dann aus zb (1,3,4,3,5,7) nun zwei Teilstränge (1,3,4) und (3,5,7) habe vergleich ich nun diese einzelnen Elemente untereinander und habe am ende 1 <3 somit minimum 1. Was ist jedoch wenn ich eine Liste mit ungerade Anzahl an Elementen habe? Wie teile ich diese dann?

0
xxxcyberxxx  24.01.2022, 13:57
@Jathe677
Wie notiere ich , wenn ich eine Liste halbieren will (bzw wie erreiche ich das, mit einer for schleife?)

Du machst das nicht mit einer for-Schleife. Du kannst das - im Pseudocode - direkt angeben:

list = (a_1, ... a_n)
sublist_a = (a_1, ..., a_(n/2))
sublist_b = (a_(n/2 + 1), ..., a_n)
und wenn ich dann aus zb (1,3,4,3,5,7) nun zwei Teilstränge (1,3,4) und (3,5,7) habe vergleich ich nun diese einzelnen Elemente untereinander und habe am ende 1 <3 somit minimum 1.

Du hast einen Vergleich übersprungen, du musst ja erstmal das Minimum von (1, 3, 4) und (3, 5, 7) bestimmen

Was ist jedoch wenn ich eine Liste mit ungerade Anzahl an Elementen habe? Wie teile ich diese dann?

auch da teilst du erstmal rekursiv weiter auf. Wenn du z.B. eine Liste mit drei Elementen hast, hat eine der Sublisten dann eben 2 Elemente und die andere ein Element

1
Jathe677 
Fragesteller
 24.01.2022, 14:09
@xxxcyberxxx

Ahhh, ok also definiere ich am Anfang direkt :

Eingabe: a_1.....a_n (e N)

sublist_a <- (a_1....a_(n/2))

sublist_b <- (a_(n/2 +1 )......a_n)

Nun müsste ich ja die rekursive Überprüfung für die beiden Stränge machen:

mach ich dies dann am besten so, dass ich eine if abfrage mach mit a1 <an wenn diese zutrifft dass die Funktion mit Sublist_a (a_1 ....a_(n/2 -1)) aufgerufen wird?

0
xxxcyberxxx  24.01.2022, 14:10
@Jathe677
mach ich dies dann am besten so, dass ich eine icabfrage mach mit a1 <an wenn diese zutrifft dass die Funktion mit Sublist_a (a_1 ....a_(n/2 -1)) aufgerufen wird?

Nein. Du überprüfst am besten, ob die Subliste genau ein Element enthält, und gibst dann dieses zurück - denn das ist offensichtlich das Minimum.

In jedem anderen Fall teilst du die Sublisten und ermittelst dann rekursiv das Minimum

1
Jathe677 
Fragesteller
 24.01.2022, 14:12
@xxxcyberxxx

ahhh ok, aber ich verstehe nicht ganz wie ich das minimum ermittle wenn es mehr als ein Element enthält?

0
xxxcyberxxx  24.01.2022, 14:20
@Jathe677
ahhh ok, aber ich verstehe nicht ganz wie ich das minimum ermittle wenn es mehr als ein Element enthält?

Nehmen wir mal an, wir haben die Liste

(5, -4, 2)

Da die Liste mehr als ein Element enthält, teilen wir sie auf:

(5, -4, 2) -> (5, -4) und (2)

Diese beiden Sublisten bearbeiten wir jetzt rekursiv. Fangen wir mit der ersten an:

(5, -4)

Die Liste enthält mehr als ein Element. Also teilen wir sie auf:

(5, -4) -> (5), (-4)

Also, wieder rekursiv arbeiten:

(5)

enthält offensichtlich nur ein einziges Element, die 5. Das ist also das Minimum dieser Teilliste

(-4)

enthält offensichtlich nur ein einziges Element, die -4. Das ist also das Minimum der Teilliste

Dann geben wir das eben zurück und beim Aufrufer vergleichen wir das Minimum dieser beiden Teillisten:

min(5, -4) = -4

Das Minimum von der Teilliste (5, -4) ist also -4

Jetzt haben wir die zweite Teilliste:

(2)

enthält offensichtlich nur ein einziges Element, ist also das Minimum. Das geben wir zurück.

Jetzt vergleichen wir die beiden Minima der Teillisten (5, -4) und (2) miteinander und geben das kleinere zurück:

min(-4, 2) = -4
1
Jathe677 
Fragesteller
 24.01.2022, 14:26
@xxxcyberxxx

Also müsste ich es dann grob so schreiben

wenn n = 1

-> Ausgabe : a1

sonst

->Minimum(Sublist_a)

jetzt ist nur noch die Frage offen wie ich es schaffe dass ich, da ich ja zwei Listen habe, die Ergebnisse beider dann zu vergleichen. Ich bekomme ja hier nur das Ergebnis von Liste Sublist_a

0
xxxcyberxxx  24.01.2022, 14:29
@Jathe677
jetzt ist nur noch die Frage offen wie ich es schaffe dass ich, da ich ja zwei Listen habe, die Ergebnisse beider dann zu vergleichen. Ich bekomme ja hier nur das Ergebnis von Liste Sublist_a

Du machst eben nicht nur einen Aufruf, sondern zwei:

So vom Prinzip:

sonst:
  min_a = Minimum(sublist_a)
  min_b = Minimum(sublist_b)
  return min(min_a, min_b)
1
Jathe677 
Fragesteller
 24.01.2022, 14:36
@xxxcyberxxx

achsooo, also am Ende dann so:

wenn n = 1

-> Ausgabe : a1

sonst 

->min_a <- Minimum(Sublist_a)

min_b <- minimum (sublist_b)

Ausgabe Minimum(min_a, min_b)

0
xxxcyberxxx  24.01.2022, 14:37
@Jathe677
Ausgabe Minimum(min_a, min_b)

nein, das sollte dann ein direkter Vergleich sein, kein weiterer rekursiver Aufruf

1
Jathe677 
Fragesteller
 24.01.2022, 14:43
@xxxcyberxxx

Also eher eine if abfrage mit min_a < min_b tue ausgäbe min_a sonst ausgäbe min_b?

1