Zitat von
rollstuhlfahrer:
Zu dem "was soll das?": ja, errare humanus est. Ich habe insgesamt jetzt 3 Fehler gemacht. Wenn noch einer einen findet, sind es mehr. Fehler 1: Größer/Kleiner habe ich schon in der Grundschule mir nur per Merkregel merken können. In der 6. Klasse habe ich eine andere Merkregel gelernt, die ich jetzt immernoch verwende. Fehler 2 war die falsche Fakultät und Fehler 3 war das Nicht-Nachrechnen des Ergebnisses.
Das zu meinen Fehlern. Wie viele machst du?
Bernhard
Hallo Bernhard,
Zunächst zu deiner abschließenden Frage:
Ich weiß nicht, wie viele Fehler ich mache, weil ich wenig Hinweise auf Fehler erhalte. Aber es wäre nett, wenn du meine Beiträge einmal kritisch anschaust und darüber berichtest. Ich freue mich, wenn man mir meine Fehler aufzeigt, denn das gibt mir die Möglichkeit, daraus zu lernen.
Dann zu deinem Vorschlag, wie N über K gerechnet werden kann:
Was mich irritierte war die Einleitung zu deinem #36 in der du schriebst, du hättest "das mit dem Kürzen mal integriert" und die Erkenntnis, daß in der gezeigten Routine überhaupt nichts gekürzt wird. Unter "Kürzen" versteht man die Streichung gemeinsamer Faktoren in Nenner und Zähler, so daß ganz platt gesagt die Zahlen kleiner werden, der Wert des Bruches aber unverändert bleibt.
Zum Beispiel deine (jetzige) Routine rechnet 49 über 6 so : (49*48*47*46*45*44) / (1*2*3*4*5*6). Da ist nichts gekürzt. Meine in #37 gezeigte Routine rechnet 49 über 6 so : 49*47*46*3*44. Die 48 wurde gegen 6,4 und 2 gekürzt, und 45 gegen 3 und 5.
Das kostet zwar einiges an Rechenzeit, erhöht aber den Rechenbereich.
Was ich weiterhin an deiner Routine nicht gut finde, ist, daß Sonderfälle und fehlerhafte Parameter nicht abgefangen werden.
Beispiele:
N über 0 (null) zum Beispiel ergibt 0, deine Routine liefert N+1.
Negatives N und/oder negatives K sollten Fehlermeldungen ergeben, deine Routine liefert Resultate, die man durchaus für richtig halten könnte.
Mein Vorschlag für eine Verbesserung deines Codes wäre
(Achtung : nicht geprüft - nur so hingeschrieben)
Delphi-Quellcode:
FUNCTION NueberK(n,k:integer):extended;
FUNCTION Mul(first,last:integer):extended;
var i:integer;
begin
result:=last;
for i:=last-1 downto first do result:=result*i;
end;
begin
if (n<0) or (k<0) then result:=NaN // oder raise ....
else if (k>n) then result:=0
else if (k=n) or (k=0) then result:=1
else result:=Mul(n-k+1,n)/Mul(2,k);
end;
Zu "errare humanus est". Tja, irren ist menschlich ... aber hieß das nicht "errare humanum est"?
An anderer Stelle schrieb ich kürzlich : "Es wäre schön, wenn alle, die so oft "aus der Hüfte geschossene" Kommentare abgeben, vorher prüfen, ob das, was sie schreiben wollen auch korrekt ist."
Schön wäre es auch, wenn User, die hier einen Code posten, vorher prüfen, ob der auch korrekt arbeitet, oder zumindest (wie man es ja gelegentlich sieht) einen klaren Hinweis geben, daß der Code ungeprüft ist.