C#斐波那契递归代码编译成功但控制台报错,求解决
问题分析及解决办法
你遇到的是栈溢出异常(StackOverflowException),核心原因是递归调用次数过多,超出了CLR的栈空间限制。结合你的代码,具体问题和解决办法如下:
问题根源
你的递归斐波那契实现存在两个潜在风险:
- 无符号整数的下溢问题:参数使用
uint(无符号整数),当传入的number小于2时,number-2会因为无符号特性下溢为极大值(比如1-2会得到4294967295),触发无限递归,直接导致栈溢出。虽然你代码里传的是10,不会触发这个情况,但如果后续传入更小的数就会出问题。 - 递归效率极低:原生递归斐波那契的调用次数是指数级增长的,比如计算
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
相关产品推荐
相关产品推荐

