2013-03-28 1 views
-1

Je travaille sur un problème Io qui implique la séquence de Fibonacci. J'essaye de créer une méthode qui teste si un nombre est un nombre de Fibonacci ou pas. Je n'arrive pas à comprendre pourquoi ma méthode IsAFib ne fonctionne pas, est-ce que quelqu'un sait pourquoi et ce que je peux faire pour la réparer? Je suis vraiment nouveau à Io, et pas très nouveau en programmation, donc si vous pouviez être descriptif avec vos raisons de changer les choses, je l'apprécierais vraiment! Je veux savoir ce qu'il doit être différent, pas seulement ce qu'il devrait être écrit.Problèmes Io Language Fibonacci

  OperatorTable addOperator("xor", 11) 
      true xor := method(bool, if(bool, false, true)) 
      false xor := method(bool, if(bool, true, false)) 

      doFile("isASquare.io"); 

Ensuite, le fichier isASquare.io:

  isASquare := method(n,      
        for(i, 1, n, 
         if(i * i == n, return true) 
         if(i * i > n, return false) 
        ) 
      ) 

      isAFib := method(n, 
        if(isASquare(2 ** 5 * n) xor isASquare(2 ** n * 5 - 4), return true, return false) 
      ) 
+0

Ne devrait-il pas être 'return isASquare (2 ** n * 5 + 4) x ou isASquare (2 ** n * 5 - 4)' d'après [Wikipedia] (http://en.wikipedia.org/ wiki/Fibonacci_number # Recognizing_Fibonacci_numbers)? – Bergi

+0

@Bergi Je pense que je veux que ce soit vrai ou faux si, afin que je puisse l'utiliser dans mes prochaines méthodes. Xor pourrait-il même fonctionner avec quelque chose comme le retour? – user2220574

Répondre

2

C'est donc un problème qui revient de temps en temps. La façon dont les opérateurs dynamiques fonctionnent est que lorsque le vm charge un fichier source, avant d'en évaluer un, nous appliquons les règles qui entourent les opérateurs. Au premier abord, io ne connaît que ses opérateurs intégrés. Une fois que ce réordonnement message est fait, nous allons commencer à évaluer le code dans le fichier, par exemple, cette première ligne:

OperatorTable addOperator("xor", 11) 

Au moment où ce code est exécuté, il est trop tard pour qu'il ait un effet sur ce fichier.

Le consensus général parmi la communauté est de mettre tous vos opérateurs dans un fichier que vous chargez en premier, et à la fin de ce fichier, ayez doFile() ou de charger votre fichier principal qui les utilisera.

C'est un peu pénible dans le cul, mais dans Io il n'y a pas de temps de compilation traditionnel.

+0

Je l'ai séparé en deux fichiers et ajouté doFile() mais je reçois toujours l'exception: erreur de syntaxe près du jeton inattendu '9 'chaque fois que j'essaie d'exécuter une méthode avec le numéro 9, etc. – user2220574

+0

Vous devrez poster tout le code alors. – jer

+0

D'accord, j'ai modifié le message original avec tout le code. – user2220574