7
votes

Comment puis-je exprimer un n factoral n! avec une fonction F #, récursif ou autrement?

une factorielle d'un nombre naturel (tout nombre supérieur ou égal à 0 ) est ce numéro multiplié par la factorielle de lui-même moins un, où la factorielle de 0 est défini comme 1 .

par exemple: xxx

Une autre façon d'écrire ceci est de multiplier tous les nombres naturels entre 1 et n pour n! : xxx

Comment puis-je exprimer cela avec une fonction récursive dans F #? Et devrait je le fais avec une fonction récursive? xxx


1 commentaires

C'est 5 !, Non! 5. ! N désigne habituellement le numéro de Derangements de n objets.


6 Réponses :


28
votes

Comment, option 1: xxx pré>

Comment, option 2 (la queue récursive, compilée dans une boucle): p> xxx pré>

devrait: Non, voir ma réponse à: p>

Tandis que lors de la récursion ou de la queue dans F #, que utiliser quand? p>

où je préconise en évitant souvent l'itération et la récursivité en faveur des fonctions d'ordre supérieur. Mais si vous venez de commencer, vous ne vous inquiétez pas encore trop de ce conseil. (Mais puis voir E.g. @ Réponse de Chaospandion, ou E.g. P>

let factorial n = [1..n] |> List.reduce (*) // doesn't require the 2nd parameter


6 commentaires

+1 qui résume-le. Serg, la 2e réponse sera plus performante.


Merci pour l'aide des gars. Je ne suis pas le gars codant copytastrer et je voudrais comprendre un peu plus ce qui se passe dans le deuxième bit. Spécifiquement le mot clé 'correspondant' et le '|' symboles. En outre, quel est le symbole _? Merci à un million, j'espère que ces questions aide les autres personnes.


"Assortiment de patterns" prendra un peu de temps pour apprendre / comprendre tous, voir les docs: msdn.microsoft.com/en-us/library/dd547125.aspx


Ou voir en.wikibooks.org/wiki/f_sharp_programming/.../a> Pour plus de modèles correspondant à.


Il retourne 0 sur la factorielle 500. Pourquoi est-ce?


Pourquoi avez-vous besoin du paramètre ACC dans l'option 2?




8
votes

Voici un autre exemple: xxx pré>

Cet exemple peut être un peu plus clair: P>

let factorial num =
    [1..num] |> Seq.fold (fun acc n -> acc * n) 1


1 commentaires

Toute raison non seulement "pour i in 1..num -> je"? Ou la liste [1..i] pour cette matière?



5
votes

Les réponses de Brian sont les plus pratiques, mais voici la solution dans la suite du style de passage: xxx


1 commentaires

Cela aurait été en train de se plier pour moi n'avai pas mis en œuvre des expressions régulières ECMAScript. Ce style est utilisé dans la spécification.



3
votes

Ma solution F # préférée aux séquences récursives est ... Séquences infinies, récursives de la queue!:

let factSeq =    
    let rec factSeq m n = 
        seq { let m = m * n
              yield m
              yield! factSeq m (n+1I) }
    seq { yield 1I ; yield 2I ; yield! (factSeq 2I 3I) }

let factTake n = factSeq |> Seq.take n //the first n terms
let fact n = factSeq |> Seq.nth (n-1) //the nth term


0 commentaires

0
votes

Voici une implémentation plus simple xxx

et pour tester xxx


0 commentaires