首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何递归检查一个数是否为斐波那契数?

如何递归检查一个数是否为斐波那契数?
EN

Stack Overflow用户
提问于 2012-11-21 13:53:38
回答 3查看 7.5K关注 0票数 3

我需要写一个程序来递归地检查一个数字是否是斐波那契数;迭代地做同样的任务很容易;而且递归地找到第n个斐波那契数也很容易,但我陷入了如何使用递归检查一个数字是否是斐波那契数的问题上。这是找到第n个fib的代码。编号:

代码语言:javascript
复制
int fib(int n){
    if (n <= 1){
       return n;
    }else {
       return (fib(n-1) + fib (n-2));
    }
}

我不知道如何修改上面的代码来检查给定的数字是否为斐波那契数?

EN

回答 3

Stack Overflow用户

发布于 2012-11-21 14:14:54

这对我来说有点笨拙,但你可以试试:

代码语言:javascript
复制
bool isFib(int numToCheck int twoPrev = 0, int prev = 1) {
    if (numToCheck == twoPrev || numToCheck == prev)
        return true;

    int currentFibNumber = twoPrev + prev;
    if (currentFibNumber == numToCheck)
        return true;
    else if (currentFibNumber > numToCheck)
        return false;

    return isFib(numToCheck, prev, currentFibNumber);
}

这基本上是使用递归迭代斐波那契数,直到生成的数超过您正在检查的值,或者找到匹配值。

正如其他人所指出的,有一些不需要递归的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2012-11-21 14:05:43

Determining whether a number is a Fibonacci number看起来是一样的,但在Java语言中,你可能会在那里得到你想要的东西。

票数 0
EN

Stack Overflow用户

发布于 2015-01-08 14:09:34

斐波那契数具有数学性质。一个数是斐波那契数当且仅当(5*n^2 + 4)或(5*n^2 - 4)中的一个或两个是完美正方形(来源: Wiki)。

这种方法比递归函数调用方法简单得多。请查看此链接:

http://www.geeksforgeeks.org/check-number-fibonacci-number/

另一种方法:

代码语言:javascript
复制
static bool IsFib(long n)//n is the number to be checked
{
    double root5 = Math.Sqrt(5);
    double phi = (1 + root5) / 2;

    long idx    = (long)Math.Floor( Math.Log(n*root5) / Math.Log(phi) + 0.5 );
    long u = (long)Math.Floor( Math.Pow(phi, idx)/root5 + 0.5);

    return (u == n);
}

此代码适用于大型输入。这是由abelenky在stackoverflow上发布的类似问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13487205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档