2010-10-20 21 views
19

J'ai regardé les différentes manières de construire des listes paresseuses dans Perl 6 et je voudrais rassembler toutes les manières concises de décrire la séquence de Fibonacci.Combien de façons y a-t-il de décrire la séquence de Fibonacci dans Perl 6?

Je vais commencer cette large avec les trois de la revue de masak:

my @fibs := (0, 1, -> $a, $b { $a + $b } ... *); 

my @fibs := (0, 1, { $^a + $^b } ... *); 

my @fibs := (0, 1, *+* ... *); 

Je pensais quelque chose comme ça fonctionnerait aussi, mais je pense avoir la mauvaise syntaxe:

my @fibs := (0, 1, (@fibs Z+ @fibs[1..*])); 

Quelque chose là-bas est impatient (la tranche?) Et fait entrer Rakudo dans une boucle infinie. Il est une traduction de la définition Haskell:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

Mise à jour:

On dirait que le problème avec le zipWith exemple est la tranche @fibs[1..*]. si tail est défini comme sub tail (@x) {my $i = 1; {@x[$i++]}...*} alors cela fonctionne correctement. Je serais curieux de savoir pourquoi la tranche n'est pas paresseuse de quiconque est familier avec les internes de Rakudo.

Une autre belle est un:

my @fibs := (0, [\+] 1, @fibs); 
+3

Ceci est l'une des raisons pour lesquelles j'aime Perl 6. :) Est-ce –

+0

la question au sujet de votre bug, ou au sujet de possibles autres solutions? Votre code manque une parenthèse fermante, si la syntaxe de Perl 6 n'est pas plus étrange que je ne le pensais ... –

+0

Avez-vous essayé votre code sur des roquets? –

Répondre

0

Vous pouvez utiliser la magie du rapport d'or: laisser φ = (sqrt (5) + 1)/2, et définir fib (n) =n + (1- φ) n)/sqrt (5).

Vous pouvez convertir une telle fonction dans une liste paresseuse de manière évidente: Dans Haskell les travaux suivants:

 
fibs=genfibs 0 where genfibs n=(round (fib n)):genfibs (n+1) 

Je crains que ma connaissance Perl 6 n'est pas à traduire cela, désolé! Toute personne qui édite cette réponse à éditer dans les codes gagnera ma gratitude.

Une question de test plus serait de lister les façons de générer la liste paresseuse des nombres de Hamming.

+1

Désolé d'être pédant, mais pour plus de clarté: le ratio golder est de 0,5 * (sqrt (5) +1) et la forme fermée d'un nombre de fibonacci est ((1 + sqrt (5))^n - (1-sqrt (5))^n)/(2^n * sqrt (5)) = (φ^n- (1-φ)^n)/sqrt (5) [http://mathworld.wolfram.com/FibonacciNumber.html ] – Phil

+1

@Phil: Oui, j'aurais dû vérifier, au moins ce cas n = 0 travaillé. Loin d'une correction pédante; Merci beaucoup. –

+2

Une façon de transformer une telle fonction en une liste paresseuse dans Perl 6 est 'my @fibs = -> {fib $ ++} ... *'.Je ne pense pas que ce que vous avez puisse être facilement traduit directement en Perl 6 car les fonctions ne sont normalement pas paresseuses. '$ perl6 -e 'constante φ = (sqrt (5) +1)/2; sub fib (\ n) {(φ ** n - (1-φ) ** n)/sqrt (5)}; mes @fibs = -> {round fib $ ++} ... *; say @ fibs ', bien que cela commence à obtenir des résultats incorrects après les 70 premiers résultats en raison d'erreurs à virgule flottante. (J'ai obtenu plus de nombres corrects avec FatRats, mais cela ralentit considérablement les calculs) –

3

Le semble être le plus court

my @fibs := ^2,*+*...*;