Génération de la suite de Fibonacci F#
Je viens juste de commencer à apprendre F# à l'aide de VS2010 et ci-dessous est ma première tentative à la génération de la suite de Fibonacci. Ce que j'essaie de faire est de construire une liste de tous les numéros de moins de 400.
let fabList =
let l = [1;2;]
let mutable a = 1
let mutable b = 2
while l.Tail < 400 do
let c = a + b
l.Add(c)
let a = b
let b = c
Mon premier problème est que sur le dernier relevé, j'obtiens un message d'erreur "Incomplet structuré construire à ou avant ce moment, dans l'expression" sur la dernière ligne. Je ne comprends pas ce que je fais mal ici.
Bien que cela semble être une façon évidente pour construire la liste est assez efficace (à partir de c++/C#, programmeur), du peu que je sais de f#, cela ne semble pas l'impression d'être la bonne façon de faire le programme. Ai-je raison de ce sentiment?
while
des constructions en boucle au premier abord.OriginalL'auteur photo_tom | 2010-05-16
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous utilisez
let
comme si c'était une déclaration de muter une variable, mais ce n'est pas le cas. En F#,let
est utilisé pour déclarer une nouvelle valeur (qui peut cacher toutes les valeurs précédentes du même nom). Si vous voulez écrire du code à l'aide de mutation, alors vous devez utiliser quelque chose comme:La deuxième question avec votre code, c'est que vous êtes en train de muter F# liste en ajoutant des éléments à elle - F# les listes sont immuables, donc une fois que vous créez, vous ne pouvez pas les modifier (en particulier, il n'y a pas de
Add
membre!). Si vous souhaitez écrire à l'aide de cette mutation, vous pourriez écrire:Mais, comme d'autres l'a déjà noté, l'écriture du code dans cette voie n'est pas la idiomatiques F# solution. En F#, vous pouvez utiliser immuable listes et récursivité au lieu de boucles (comme
while
). Par exemple, comme ceci:C'est la façon dont nous tous, qui avons impératif de l'immigration se sentent pour la première fois :-). L'immuabilité est l'un des concepts essentiels et le reste de la fonctionnelle idées à la suivre.
Très belle réponse. Un point intéressant de mentionner est le fait que comme une approche générale lors de la création de fonctions récursives l'Appel à la fonction auto doit toujours être la dernière opération de cette branche particulière de sorte que la queue de l'Appel d'optimisation Peut être effectuée. Dans ce cas particulier, avec plus de 400 comme la limite d'une stackoverflow est la cause généralement pas un problème
OriginalL'auteur Tomas Petricek
D'autres postes, de vous dire comment écrire le tout en boucle à l'aide de fonctions récursives. C'est une autre façon en utilisant la Seq bibliothèque en F#:
pour plus d'explications, veuillez ref solution 2 dans F# pour le Projet Euler Problèmes, où les 50 premiers d'Euler, les problèmes sont résolus. Je pense que vous serez intéressé par ces solutions.
Merci pour le lien - pour F# pour le Projet Euler Problèmes. Je suis en train de travailler sur certains de ces problèmes pour les aider à apprendre F#.
Je pense que la première ligne devrait en fait être: laissez fibSeq = Seq.déplier (fun (a,b) -> Certains( a+b, (a+b, a) ) ) (0,1)
Est-il possible de faire cette fonctionnellement sans répéter le a+b?
Le F# pour le Projet Euler Problèmes de site web a expiré, voici une archive: web.archive.org/web/20120702222856/http://...
OriginalL'auteur Yin Zhu
np. Je suis d'accord avec la raison.
Nice, séquence infinie d'être évalué paresseusement. Il suffit de ne pas essayer de convertir l'infini seq pour un tableau ou une Liste, sauf si vous avez beaucoup de RAM ;).
OriginalL'auteur Grozz
Voici une infinie queue solution récursive à l'aide de la séquence d'expressions. Il est tout à fait efficaces, la production de la de la 100 000 ème terme en seulement quelques secondes. Le "rendement" de l'opérateur est exactement comme en C#'s "taux de retour", et le "rendement!" opérateur peut être lu comme "le rendement de tous", où en C# vous avez à faire "foreach point ... " taux de retour".
https://stackoverflow.com/questions/2296664/code-chess-fibonacci-sequence/2892670#2892670
Cette approche est semblable à la suivante en C# (qui utilise un while(true) boucle au lieu de la récursivité):
Trouver une séquence de Fibonacci en C#. [Projet Euler Exercice]
En effet! J'ai ramassé l'Expert F# livre en 2008, à le lire, et absorbé autant que je le pouvais, mais n'était pas vraiment prêt pour cela à l'époque. Cependant, il m'a fait expérimenter avec rendement/IEnumerable et les délégués en C# à mon travail (même pré-linq C# 2.0 a ces fonctionnalités), et j'ai trouvé aujourd'hui, deux ans plus tard, je vais avoir un temps beaucoup plus facile d'accoler F# sérieusement.
OriginalL'auteur Stephen Swensen
Oui, mutable variables et les boucles while sont généralement un bon signe que votre code n'est pas très fonctionnel. Aussi la suite de fibonacci, ne commence pas avec le 1,2 - il commence avec 0,1 ou 1,1 en fonction de qui vous demandez.
Voici comment je ferais:
OriginalL'auteur sepp2k
Cette fonction "fib" renvoie la liste des nombres de Fibonacci qui ne sont pas de plus de 500
OriginalL'auteur qqus
Un plus codata new'ish façon:
OriginalL'auteur olegz
Un avec un tableau:
OriginalL'auteur Andriy Tolstoy
Voici un bon article .Net le gourou de Scott, Hanselman sur la génération de la suite de fibonacci F#
http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx
Il compare aussi avec d'autres langues comme référence
OriginalL'auteur Robben_Ford_Fan_boy
La grande solution de Scott, Hanselman n'a pas rapport au 0 de la suite de fibonacci.
Voici donc un changement mineur à sa solution de rapporter aussi le 0.
J'ai utilisé une petite liste de 0 à 10 pour afficher les 11 premiers éléments de la séquence.
Je suis nouveau et d'incompétence par rapport à f# et pas encore totalement comprendre pleinement le besoin. Mais trouve cela un test intéressant.
Juste pour le fun : Si trouvé une formule de Binet qui calcule le n-ième nombre de Fibonacci.
Malheureusement, certaines des fonctions en virgule flottante sont nécessaires pour obtenir le résultat sous forme d'entier de retour à la fin :
[Fibonacci de la formule de Binet][1]
http://i.stack.imgur.com/nMkxf.png
Un rapide et sale de la traduction de f# serait comme indiqué ci-dessus. Je suis sûr que d'autres peuvent améliorer sur ce en matière de style et d'efficacité. L'exemple calcule le 10e numéro. Le résultat sera de 55.
OriginalL'auteur Rene Vliex