Déterminer si un nombre est un nombre de Fibonacci
J'ai besoin d'écrire du code Java qui vérifie si l'utilisateur d'inscription le nombre est dans la séquence de Fibonacci.
Je n'ai pas de problème de l'écriture de la suite de Fibonacci à la sortie, mais (probablement parce que ses tard dans la nuit) j'ai du mal à penser à la séquence de "si", c'est un nombre de Fibonacci. Je garde de départ et recommencer. Ses vraiment en train de faire ma tête.
Ce que j'ai actuellement est le n-ième.
public static void main(String[] args)
{
ConsoleReader console = new ConsoleReader();
System.out.println("Enter the value for your n: ");
int num = (console.readInt());
System.out.println("\nThe largest nth fibonacci: "+fib(num));
System.out.println();
}
static int fib(int n){
int f = 0;
int g = 1;
int largeNum = -1;
for(int i = 0; i < n; i++)
{
if(i == (n-1))
largeNum = f;
System.out.print(f + " ");
f = f + g;
g = f - g;
}
return largeNum;
}
Qu'est-ce exactement que vous essayez de faire? obtenir le n-ième nombre de fibonacci? le nombre de fibonacci qui est plus grand que n? découvrez si n est un nombre de fibonacci?
Voir stackoverflow.com/questions/2432669/....
Wow, en regardant les commentaires, il y a beaucoup de discussion sur ce qui est la meilleure solution d'un point de vue algorithmique. Mais n'oubliez pas que c'est les devoirs, et à en juger par le code, ce n'est pas exactement un des algorithmes avancés de cours. Ce qui est probablement souhaité est le code plus facile à comprendre. @Emily, votre instructeur de vous donner le sens de la façon dont vous êtes censé résoudre ce problème?
Voir ici pour des réponses rapides à l'aide de seulement plus, moins et la multiplication: stackoverflow.com/questions/5162780
Voir stackoverflow.com/questions/2432669/....
Wow, en regardant les commentaires, il y a beaucoup de discussion sur ce qui est la meilleure solution d'un point de vue algorithmique. Mais n'oubliez pas que c'est les devoirs, et à en juger par le code, ce n'est pas exactement un des algorithmes avancés de cours. Ce qui est probablement souhaité est le code plus facile à comprendre. @Emily, votre instructeur de vous donner le sens de la façon dont vous êtes censé résoudre ce problème?
Voir ici pour des réponses rapides à l'aide de seulement plus, moins et la multiplication: stackoverflow.com/questions/5162780
OriginalL'auteur Emily | 2010-06-29
Vous devez vous connecter pour publier un commentaire.
Lire la section intitulée "reconnaître les nombres de fibonacci" sur wikipedia.
Alternativement, vous pouvez continuer à produire des nombres de fibonacci jusqu'à ce que l'on devient égal à votre nombre: si c'est le cas, votre numéro est un nombre de fibonacci, si ce n'est, le nombre finira par devenir plus grand que votre numéro, et vous pouvez arrêter. C'est assez inefficace.
J - bonne question. La génération de la première
n
nombres de fibonacci est uneO(n)
temps de l'opération. L'extraction de la racine carrée dez
estO(log z)
. Je suis enclin à dire que pourn
assez grand pour les nombres de fibonacci à exiger de grands entiers, la racine carrée est plus rapide, mais je ne suis pas sûr.les valeurs suivantes dans la séquence de Fibonacci approche très particulière ratio (Or). par conséquent, ils peuvent être grossièrement approchée en tant que ratio^le nombre d'étapes pour atteindre le nombre (avec certains des facteurs constants). c'est à dire log(z) ~ n log(phi) - qui indiquerait que le fait de prendre la racine carrée et simplement en comptant jusqu'sont assez proches. Cependant, je pense que l'avantage peut-être que l'on peut évaluer la non-entier-ness d'une racine carrée (c'est à la main en agitant, pas exactement) en moins de log(z).
La Nappe De La Méthode!!!
Vache sacrée bonne réponse! En tant que mathématiques majeur, je suis étonné que cela pourrait effectivement être vrai. Génial-o.
OriginalL'auteur IVlad
Si je comprends bien, ce que vous devez faire (au lieu d'écrire la première n nombres de Fibonacci) est de déterminer si n est un nombre de Fibonacci.
De sorte que vous devriez modifier votre méthode pour générer la séquence de Fibonacci jusqu'à ce que vous obtenez un certain nombre >= n. Si elle est égale, n est un nombre de Fibonacci, pas autrement.
Mise à jour: buggé par @Moron répétée de revendications au sujet de la formule de base de l'algorithme d'avoir une meilleure performance pour la simple ci-dessus, j'ai fait un test de comparaison concrètement entre Jacopo de la solution l'algorithme du générateur de et StevenH dernière version formule à base d'algorithme. Pour référence, voici le code exact:
Les résultats ont surpris même moi:
En bref, l'algorithme du générateur de manière plus performante que la formule de la solution basée sur du positif valeurs int - même proche du maximum int valeur, il est deux fois plus rapide!
Tellement de conviction basée sur l'optimisation de la performance 😉
Pour l'enregistrement, la modification du code ci-dessus pour utiliser
long
des variables au lieu deint
, le générateur de l'algorithme devient plus lent (comme prévu, puisqu'il a ajouterlong
valeurs d'aujourd'hui), et le basculement point où la formule commence à être plus rapide est d'environ 1000000000000L, c'est à dire 1012.Update2: Comme IVlad et Moron noté, je ne suis pas un expert dans les calculs en virgule flottante 🙂 en fonction de leurs suggestions, j'ai amélioré la formule:
Ramené le passage point de env. 108 (pour le
long
version - le générateur avecint
est encore plus rapide pour toutes les valeurs int). Pas de doute que le remplacement de lasqrt
appels avec quelque chose comme suggéré par @Débile de les pousser vers le bas, le passage point de plus.Mon (et IVlad) point était simplement qu'il y aura toujours un point de basculement, en dessous de laquelle le générateur de l'algorithme est plus rapide. Si les revendications à propos de celui qui fonctionne mieux n'ont aucune signification en général, que dans un contexte.
deux choses à ce sujet: "downvoting est parfois fait pour obtenir les bonnes réponses à la partie supérieure. Parfois, cela signifie downvoting tous, mais une seule réponse." 1) cela sonne étrangement proche de tactique downvoting 2) c'est d'un ridicule explication pour downvoting un réponse 1 score au moment de la réponse sommet a 12 😉 bien sûr, n'hésitez pas à downvote, je n'ai pas l'esprit les points perdus. Ce que j'ai l'esprit est fragile raisonnement.
point de downvoting est d'obtenir des réponses de qualité vers le haut" - IMO c'est le point de upvoting. Et si vous pensez que j'ai été ce qui implique IVlad était le downvoter, lire plus attentivement.
N'utilisez pas les Mathématiques.Sqrt ou les Mathématiques.Pow! 🙂 Utiliser les binaires de recherche pour déterminer si 5f^2 +- 4 est un carré parfait. Ou mieux encore, utiliser ceci: stackoverflow.com/questions/295579/...
+1 pour le fait de benchmarking au lieu de simplement deviner.
OriginalL'auteur Péter Török
Au lieu de passer l'index,
n
, écrire une fonction qui prend une limite, et d'obtenir pour générer les nombres de Fibonacci jusqu'à et y compris cette limite. Obtenir pour retourner un Booléen selon qu'il frappe ou saute au-dessus de la limite, et vous pouvez l'utiliser pour vérifier si cette valeur est dans la séquence.Puisque c'est les devoirs, un coup de pouce comme c'est probablement tout ce que nous devrions être en vous donnant...
OriginalL'auteur David M
Ok. Puisque les gens j'ai dit que je suis juste de parler l'air mince ('faits' vs 'devine'), sans toutes les données à sauvegarder, j'ai écrit un test de mon propre.
Pas java, mais C# code ci-dessous.
Et voici la sortie
La méthode sqrt bat la méthode naïve lorsque n=50, peut-être en raison de la présence de matériel de soutien sur ma machine. Même si elle était de 10^8 (comme dans l'épreuve de Pierre), il y a au plus 40 nombres de fibonacci en vertu de cette coupure, ce qui pourrait facilement être mis dans une table de recherche et de toujours battre la version naïve pour les plus petites valeurs.
Aussi, Peter a une mauvaise mise en œuvre de la SqrtVersion. Il n'a pas vraiment besoin de calculer deux racines carrées ou calculer des puissances de l'utilisation des Mathématiques.Pow. Il aurait au moins essayé de faire mieux avant la publication de ses résultats de référence.
De toute façon, je vais laisser les faits parler d'eux-mêmes, au lieu de la soi-disant 'devine'.
OriginalL'auteur
Un entier positif x est un nombre de Fibonacci si et seulement si l'un de 5x^2 + 4 et 5x^2 - 4 est un carré parfait
Reconnaître les nombres de Fibonacci: en.wikipedia.org/wiki/...
OriginalL'auteur Soufiane Hassou
Il y a un certain nombre de méthodes qui peuvent être utilisées pour déterminer si un nombre donné est dans la séquence de fibonacci, une sélection de ce qui peut être vu sur wikipedia.
Compte tenu de ce que vous avez fait déjà, cependant, je serais probablement utiliser plus de force brute approche, telle que la suivante:
Je serais probablement utiliser une méthode récursive, en passant un courant n-valeur (ie. donc, il calcule le n-ième nombre de fibonacci) et le numéro de la cible.
OriginalL'auteur Edd
OriginalL'auteur Nithya
Si mon Java n'est pas trop rouillé...
OriginalL'auteur Iacopo
D'essayer d'utiliser le code que vous avez déjà écrit, je souhaiterais vous proposer la suite de la première, comme c'est la solution la plus simple (mais pas le plus efficace):
Je propose une solution plus élégante dans la génération de nombres de fibonacci, qui tire profit de la récursivité de la sorte:
Pour le crédit supplémentaire de lecture: http://en.wikipedia.org/wiki/Fibonacci_number#Recognizing_Fibonacci_numbers
Vous allez voir qu'il y a quelques des moyens plus efficaces pour tester si un nombre est dans la Fibonacci de la série à savoir: (5z^2 + 4 ou 5z^2 − 4) = un carré parfait.
N'en déplaise à Peter, mais sa mise en œuvre de sqrt vérifier suce et est pratiquement d'aucune utilité dans l'analyse comparative.
Je ne prétends pas le mien - c'était du copier-collé directement à partir d'ici 🙂
Je vois. Je m'excuse 🙂
OriginalL'auteur holsee
Je ne sais pas si il y a une formule que vous pouvez appliquer à l'entrée de l'utilisateur, cependant, vous pouvez générer la séquence de fibonacci et de la comparer à l'entrée de l'utilisateur jusqu'à ce qu'il est devenu plus petit que le dernier numéro est généré.
OriginalL'auteur Chris J
Vous pouvez le faire de deux façons , la récursivité et les mathématiques.
la manière récursive
commencer à générer une séquence de fibonacci jusqu'à ce que vous frappez le nombre ou la passer
la manière mathématique joliment décrit ici ...
http://www.physicsforums.com/showthread.php?t=252798
bonne chance.
OriginalL'auteur Stas
Tenir compte de la séquence de nombres de Fibonacci 1,1,2,3,5,8,13,21, etc. Il est souhaitable de construire 3 piles chacune de capacité 10 contenant des numéros de séquences susmentionnées comme suit:
Pile 1: 10 Premiers numéros de la séquence.
Pile 2: les 10 Premiers nombres premiers à partir de la séquence.
Pile 3: 10 non-nombres premiers à partir de la séquence.
(i) Donner un algorithme de l'organigramme
(ii) Écrire un programme (en BASIC, C++ ou Java) pour mettre en œuvre cette.
De sortie:pile opérations que vous devrait s'afficher dans n'importe quelle forme les 3 piles avec les valeurs détenues en eux.
OriginalL'auteur Seidu Lukman Lutie
Constatation de l'existence d'un nombre de Fibonacci est basé sur la formule:
OriginalL'auteur realPK
Pensais que c'était simple jusqu'à ce que j'avais à rack de ma tête il y a quelques minutes. Son tout à fait différent de la génération d'une séquence de fibonacci. Cette fonction renvoie 1 si est Fibonnaci ou 0 si pas
OriginalL'auteur karto