Hallo Community,
ich bin gerade dabei, ein kleines F#-Programm zu schreiben, welches mir ein paar Daten aufbereiten soll.
Erstmal das eigentliche Problem:
Ich habe eine Reihe von Werten, zum Beispiel:
Nun möchte ich, dass alle Werte einen aufsteigenden Graphen ergeben. (Die Werte stammen von einer selbstgeschriebenen Objecttracking-Software, die manchmal aufgrund meines nur schlechten Videomaterials ungenau arbeitet.)
Lösung 1:
Man nimmt den zuletzt höchsten Wert und ersetzt die niedrigeren Werte einfach durch ihn.
Das ergibt allerdings im Graphen eine Zacke von 20 zu 30.
Deswegen möchte ich sozusagen "künstlich" Werte einschmuggeln, sodass die Lücke (=Bereich mit niedrigeren Werten) gleichmäßig befüllt wird:
Allerdings bin ich daran gescheitert, für folgenden imperativen Algorithmus einen funktionalen Code zu zaubern.
PHP-Version:
Meine Fragen:
a) Gibt es einen besseren Lösungsweg bzw. Algorithmus als den, den ich oben in PHP geschrieben habe?
b) Wie würde man diesen in einer funktionalen Sprache (vornehmlich F#) ausdrücken? Ich scheitere schon beim Vorspulen des Array-Index-Zählers ($i = $smallerValuesStop im oberen Skript).
Vielen Dank schonmal im Voraus!
ich bin gerade dabei, ein kleines F#-Programm zu schreiben, welches mir ein paar Daten aufbereiten soll.
Erstmal das eigentliche Problem:
Ich habe eine Reihe von Werten, zum Beispiel:
Code:
10
20
15
17
30
Lösung 1:
Code:
10
20
20 (15 --> 20)
20 (17 --> 20)
30
Das ergibt allerdings im Graphen eine Zacke von 20 zu 30.
Deswegen möchte ich sozusagen "künstlich" Werte einschmuggeln, sodass die Lücke (=Bereich mit niedrigeren Werten) gleichmäßig befüllt wird:
Code:
10
20
23 1/3 (15 --> 23 1/3)
26 2/3 (17 --> 26 2/3)
30
Allerdings bin ich daran gescheitert, für folgenden imperativen Algorithmus einen funktionalen Code zu zaubern.
PHP-Version:
PHP:
$values = [1, 2, 3 /*, ...*/];
$out = [];
$prev = -1;
for ($i=0; $i<count($values); $i++) {
if ($values[$i] > $prev) {
$prev = $values[$i];
$out[] = $values[$i];
}
else {
$smallerValuesStop = -1;
for ($j=$i; $j<count($values); $j++) {
if ($values[$j] > $prev) {
$smallerValuesStop = $prev;
}
}
// Es ist garantiert, dass $smallerValuesStop != -1 (=Default-Wert) ist
$splits = ($smallerValuesStop - $i);
$splitValue = ($values[$smallerValuesStop] - $values[$i]) / ($splits+1);
$sum = $values[$i];
while ($splits--) {
$sum += $splitValue;
$out[] = $sum;
}
$i = $smallerValuesStop;
}
}
Meine Fragen:
a) Gibt es einen besseren Lösungsweg bzw. Algorithmus als den, den ich oben in PHP geschrieben habe?
b) Wie würde man diesen in einer funktionalen Sprache (vornehmlich F#) ausdrücken? Ich scheitere schon beim Vorspulen des Array-Index-Zählers ($i = $smallerValuesStop im oberen Skript).
Vielen Dank schonmal im Voraus!