NC65 斐波那契数列

https://www.nowcoder.com/share/jump/8325865981750260107387

描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

斐波那契数列是一个满足 fib(x)={1x=1,2fib(x−1)+fib(x−2)x>2fib(x)={1fib(x−1)+fib(x−2)​x=1,2x>2​ 的数列

数据范围:1≤n≤401≤n≤40

要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n) ,本题也有时间复杂度 O(logn)O(logn) 的解法

输入描述:

一个正整数n

返回值描述:

输出一个正整数。

第一次提交运行时,提示错误:

solution.c:25:1: error: non-void function does not return a value in all control paths [-Werror,-Wreturn-type]
}
^
#include <stdio.h>
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return int整型
 */
int Fibonacci(int n )
{
    int val;
    val = n;
    // write code here
    if ((val < 1) || (val > 40))
    {
        return -1;
    } else if ((val == 1) || (val == 2))
    {
        return 1;
    }
    if ((val > 2) && (val < 41))
    {
        return (Fibonacci(val-1) + Fibonacci(val-2));
    }
}

错误原因:

这个错误提示表明函数 Fibonacci 在某些控制路径中没有返回值。具体来说,当 val 的值在 2 < val < 41 时,你的代码会进入递归调用,但编译器认为如果条件不满足时(虽然逻辑上已经覆盖了所有情况),函数没有明确的返回值。

为了解决这个问题,你可以在函数的最后添加一个默认的 return 语句,即使逻辑上不会执行到那里。以下是修正后的代码:

int Fibonacci(int n )
{
    int val;
    val = n;
    // write code here
    if ((val < 1) || (val > 40))
    {
        return -1;
    } else if ((val == 1) || (val == 2))
    {
        return 1;
    }
    if ((val > 2) && (val < 41))
    {
        return (Fibonacci(val-1) + Fibonacci(val-2));
    }
    return -1; // 默认返回值,虽然逻辑上不会执行到这里
}

其他建议:

  • 递归实现是正确的,但对于较大的 n(比如接近 40),递归的效率会很低,因为会有大量的重复计算。可以考虑使用动态规划或迭代的方法来优化性能。
  • 条件 (val > 2) && (val < 41) 可以简化为 val > 2,因为前面的条件已经排除了 val <= 2 和 val > 40 的情况。

优化后的代码(迭代法):

int Fibonacci(int n)
{
    if (n < 1 || n > 40)
    {
        return -1;
    }
    if (n == 1 || n == 2)
    {
        return 1;
    }
    int a = 1, b = 1, c;
    for (int i = 3; i <= n; i++)
    {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务