Fakultät berechnen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Nein leider nicht. Aber du kannst es so machen:

    VB.NET-Quellcode

    1. Public Function Factorial(ByVal x As Integer) As Integer
    2. If x <= 1 Then
    3. Return 1
    4. Else
    5. Return x * Factorial(x - 1)
    6. End If
    7. End Function


    Ich schreibe zur Zeit ne Library dafür. ;)

    @LaMiy
    Wieso Schwachsinn?
    Dein Code macht es halt ein wenig einfacher...
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    Hallo zusammen, noch ein kleiner Hinweis am Rande. Mit einer For-Schleife gehts schneller mit berechnen.

    VB.NET-Quellcode

    1. Private Function Fak2(ByVal a As Integer) As Integer
    2. If a < 1 Then
    3. Throw New ArgumentOutOfRangeException("a > 0")
    4. End If
    5. Dim r As Integer = 1
    6. For i As Integer = 1 To a
    7. r = r * i
    8. Next
    9. Return r
    10. End Function
    Jup das mit der For schleife habe ich auch schon gemacht :)

    Danke an Alle deswegen! Weitere Frage: Gibt es eine Funktion zur Berechnung von nChr also n über k oder muss man sich da auch was eigenes basteln (ist ansich kein Problem, will nur wissen ob es da schon eine Funktion für gibt.):

    (n!)/(n-k)!*k!

    8-) faxe1008 8-)
    @faxe1008
    Wenn du bei nCr wieder Fakultät drin haben willst, dann sparst du viel Code:

    VB.NET-Quellcode

    1. Public Function Pick(ByVal n As Integer, ByVal r As Integer) As Integer
    2. If n < r Then
    3. Return 0
    4. Else
    5. Return CInt(Factorial(n) / Factorial(n - r))
    6. End If
    7. End Function



    nPr:

    VB.NET-Quellcode

    1. Public Function Choose(ByVal n As Integer, ByVal r As Integer) As Integer
    2. If n < r Then
    3. Return 0
    4. Else
    5. Return CInt(Factorial(n) / (Factorial(r) * Factorial(n - r)))
    6. End If



    Nutzt also die Funktion von oben.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Jo habe es so gelöst:

    VB.NET-Quellcode

    1. Public Function nbovek(ByVal n As Integer, ByVal k As Integer) As Integer
    2. Return (Fakultät(n)) / (Fakultät(n - k) * Fakultät(k))
    3. End Function


    Wo liegt der Unterschied zwischen nCr und nPr eigentlich?

    8-) faxe1008 8-)
    Bei nCr darf es sich wiederholen, bei nPr nicht.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    faxe1008 schrieb:

    Jo habe es so gelöst:
    Bei den Fakultäten kommst Du sehr schnell zu sehr großen Zahlen.
    Als erstes würde ich nicht mit Integer sondern mit Long arbeiten, das dürfte praktisch keinen Performance-Verlust bringen.
    Wenn Du dann noch größere Zahlen bearbeiten willst, sieh Dir BigInteger an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Trade schrieb:

    Bei nCr darf es sich wiederholen, bei nPr nicht.

    Falsch. Bei nCr ist die Reihenfolge, in der die Elemente angeordnet werden egal, bei nPr ist die Reihenfolge entscheidend.
    Kleiner Nachtrag am Rande:
    Wenn ich die Definition noch korrekt im Kopf habe, ist Fakultät für negative Zahlen nicht definiert.
    Deswegen lieber Unsigned-Datentypen verwenden.
    Ausserdem sollte man den OverFlow abfangen, weil (wie oben schon erwähnt) die Zahlen recht schnell in ungeahnte Dimensionen steigen.
    Also zumindest

    VB.NET-Quellcode

    1. Public Function Factorial(ByVal x As ULong) As ULong
    2. Try
    3. If x < 2 Then Return 1 Else Return x * Factorial(x - CULng(1))
    4. Catch e As System.OverflowException
    5. Return 0
    6. End Try
    7. End Function
    oder gleich mit richtig dicker Hose:

    VB.NET-Quellcode

    1. Function BigFactorial(ByVal x As BigInteger) As BigInteger
    2. If x.Sign = -1 Then Return 0 'undefined for negative x, result 0 marks error
    3. If x < 2 Then Return 1 ' 0! and 1!
    4. Return BigInteger.Multiply(x, BigFactorial(BigInteger.Subtract(x, 1))) 'recurse call
    5. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()