You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#斐波那契递归代码编译成功但控制台报错,求解决

问题分析及解决办法

你遇到的是栈溢出异常(StackOverflowException),核心原因是递归调用次数过多,超出了CLR的栈空间限制。结合你的代码,具体问题和解决办法如下:

问题根源

你的递归斐波那契实现存在两个潜在风险:

  1. 无符号整数的下溢问题:参数使用uint(无符号整数),当传入的number小于2时,number-2会因为无符号特性下溢为极大值(比如1-2会得到4294967295),触发无限递归,直接导致栈溢出。虽然你代码里传的是10,不会触发这个情况,但如果后续传入更小的数就会出问题。
  2. 递归效率极低:原生递归斐波那契的调用次数是指数级增长的,比如计算F(10)需要调用177次方法,计算F(30)就要调用超过26万次,稍微大一点的数值就会快速耗尽栈空间。

解决办法

办法1:修复参数类型,添加合法性检查

把参数类型从uint改为int,同时添加负数输入的判断,避免非法递归:

using System;
namespace A
{
    class Program
    {
        public static int FibonacciRecursive(int number)
        {
            if (number < 0)
                throw new ArgumentOutOfRangeException(nameof(number), "不能输入负数");
            if (number == 0) return 0;
            if (number == 1) return 1;

            return FibonacciRecursive(number - 1) + FibonacciRecursive(number - 2);
        }

        static void Main(string[] args)
        {
            // 加上输出,查看计算结果
            Console.WriteLine(FibonacciRecursive(10)); 
        }
    }
}

办法2:改用迭代实现(推荐)

迭代法不会产生递归栈,效率远高于递归,也不会出现栈溢出:

using System;
namespace A
{
    class Program
    {
        public static int FibonacciIterative(int number)
        {
            if (number < 0)
                throw new ArgumentOutOfRangeException(nameof(number), "不能输入负数");
            if (number == 0) return 0;
            if (number == 1) return 1;

            int prevPrev = 0;
            int prev = 1;
            int current = 0;
            for (int i = 2; i <= number; i++)
            {
                current = prevPrev + prev;
                prevPrev = prev;
                prev = current;
            }
            return current;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(FibonacciIterative(10));
        }
    }
}

办法3:递归+记忆化优化

如果一定要用递归,通过缓存已计算的结果减少重复调用,避免栈溢出:

using System;
using System.Collections.Generic;
namespace A
{
    class Program
    {
        private static Dictionary<int, int> _fibCache = new Dictionary<int, int>();

        public static int FibonacciMemoized(int number)
        {
            if (number < 0)
                throw new ArgumentOutOfRangeException(nameof(number), "不能输入负数");
            if (number == 0) return 0;
            if (number == 1) return 1;

            if (_fibCache.ContainsKey(number))
                return _fibCache[number];

            int result = FibonacciMemoized(number - 1) + FibonacciMemoized(number - 2);
            _fibCache[number] = result;
            return result;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(FibonacciMemoized(10));
        }
    }
}

内容的提问来源于stack exchange,提问作者Snowflake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:20