une factorielle d'un nombre naturel (tout nombre supérieur ou égal à par exemple: p> Une autre façon d'écrire ceci est de multiplier tous les nombres naturels entre Comment puis-je exprimer cela avec une fonction récursive dans F #? Et devrait em> je le fais avec une fonction récursive? P> 0 code>) est ce numéro multiplié par la factorielle de lui-même moins un, où la factorielle de
0 code> est défini comme
1 code>.
1 Code> et
n code> pour
n! code>: p>
6 Réponses :
Comment, option 1: Comment, option 2 (la queue récursive, compilée dans une boucle): p> 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
+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 code> dans l'option 2?
Comment puis-je déclarer une fonction récursive pour cela? P> blockQuote>
Tout d'abord, pour définir une fonction récursive, vous utiliseriez
let Rec code> au lieu de
let code> (car
let code> ne vous permet pas faire référence à la fonction que vous définissez de manière récursive). p>
Pour définir la fonction factorielle de manière récursive, la voie la plus facile (mais pas la plus efficace) serait d'utiliser la définition mathématique standard de la fonction factorielle. P>
Une approche plus efficace serait de définir une fonction d'aide à la queue récursive prenant un deuxième argument qui stocke le résultat calculé jusqu'à présent. P>
Selon ce que j'ai lu sur Stackoverflow ce matin en parcourant la balise F #, je peux en fait sauter le mot-clé «REC», mais je dois déclarer explicit explicitement les fichiers de données. Corrigez-moi si j'ai tort, s'il-vous plait.
@Serg: Vous avez tort. Si vous n'utilisez pas rec code> la fonction que vous définissez n'est tout simplement pas accessible dans sa définition.
Vous devez dire «Rec» pour définir une fonction récursive, sinon l'identifiant de nom de la fonction ne sera pas dans la portée. Voir Stackoverflow.com/Questtions/3739628/...
Voici un autre exemple: Cet exemple peut être un peu plus clair: P> let factorial num =
[1..num] |> Seq.fold (fun acc n -> acc * n) 1
Toute raison non seulement "pour i in 1..num -> je"? Ou la liste [1..i] pour cette matière?
Les réponses de Brian sont les plus pratiques, mais voici la solution dans la suite du style de passage:
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.
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
Voici une implémentation plus simple et pour tester p>
C'est 5 !, Non! 5.
! N code> désigne habituellement le numéro de Derangements de
n code> objets.