C中的斐波纳契数列

时间:2010-07-02 11:37:42

标签: c math

这是预期的输出:

alt text http://i48.tinypic.com/f1lfuh.jpg

我们要制作一个计算Fibonacci序列的C程序。 我们最多只允许3个变量,我们不允许使用循环。 我不知道该做什么以及如何开始。

我希望你们能帮助我。 :/

7 个答案:

答案 0 :(得分:21)

假设您使用32位无符号整数,第48个Fibonacci数将导致整数溢出。这使得使用具有预先计算的所有值的查找表(手动)是完全可行的。

答案 1 :(得分:17)

使用递归:

alt text


C / C ++语言版本:

int fib(int a)
{
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}

应用此回答评论的建议:

C语言版本:

/*
 * -1 is a error handler
 */
int fib(int a)
{
    if (a < 0 || a > 47) return -1;
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}

C ++语言版本:

int fib(int a)
{
    if (a < 0) throw new std::out_of_range("Fibonacci is not defined for negative sign values.");
    if (a > 47) throw new std::overflow_error("Fibonacci for this value was overflow the integer.");
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}

答案 2 :(得分:7)

我怀疑如果你不能使用你的教授/老师打算你使用递归的循环。否则,只需要查找正确的公式,这在编程类中是没有意义的。

如果允许递归,我高度推荐阅读this教程(假设您不熟悉它)。

答案 3 :(得分:7)

如果不允许循环和递归,请选择斐波纳契序列定义并手工完成......这是非常无聊和无趣的,但它是这些限制中最直接的解决方案。

a = 0; // 0
b = 1; // 1
a = a + b; // 1
b = a + b; // 2
a = a + b; // 3
b = a + b; // 5

等等:b保存第n个和第(n-1)个数字。 (复制粘贴a = a+b; b = a+b;您需要多少次...)允许复制粘贴代码片段?

...(编辑)...

当然,这个答案只是说明如果我们放了太多的rescrictions,那些嘲笑的东西会得到什么。如果你不知道递归,你必须明确地学习它。或者坚持精细数学(如其他答案所示),但递归是程序员应该知道的强大工具,并且递归方法比使用数学“技巧”更直观。

答案 4 :(得分:7)

答案 5 :(得分:4)

http://mathworld.wolfram.com/BinetsFibonacciNumberFormula.html

你可以在这里复制

http://cboard.cprogramming.com/cplusplus-programming/108426-binets-formula.html

long double f(short N) {
    double phi = (1+pow(5,0.5))/2;
    return ceil((pow(phi,N) - pow(1-phi,N))/pow(5,0.5));
}

当然,它只是数学,但它确实计算了没有递归和循环的fib(N)..你仍然需要一种方法来打印fib(1)的所有值.. fib(n)虽然

你老师想要的可能是递归。

答案 6 :(得分:4)

由于不允许循环和递归,

int fib(int n) {
   int fk1 = 0, fk0 = 1;
main_sub3:
   fk1 += fk0;
   fk0 = fk1 - fk0;
   if (n > 0) {
     -- n;
     goto main_sub3;

* raptor *