卧闲听云语聪睿 发表于 2023-11-16 12:41:25

为了性能,慎用递归

慎用递归

起因:

在学习Rust的时候,有一道语法练习题是计算斐波那契数列的第N项的值,这是一道非常简单的题,但是引发了一个使用递归性能问题,考虑到用Rust的人不多,后面的代码都是C#的,因为C#的语法更大众一些,更好看懂
第一次解

public static ulong FibonacciNumberRecursion(int n)
{
    if (n == 1)
      return 0;
    else if (n == 2)
      return 1;
    else
    {
      return FibonacciNumberRecursion(n - 1) + FibonacciNumberRecursion(n - 2);
    }
}这个写法非常的符合大脑思考,第一项返回0,第二项返回1,后面的返回前两项之和,简单测试没有任何问题。但是,这个算法有非常严重的性能问题,当n到40的时候,计算速度已经到了肉眼不可接受的地步,再往上就到了分钟级的了,造成运行缓慢的原因,就是递归会不停的压栈,存储当前的状态,这是非常没有必要的,于是我写了第二种解法
第二次解

public static ulong FibonacciNumber(int n){    if (n == 1)      return 0;    else if (n == 2)      return 1;    else    {      var x = 3;      ulong xSub1 = 1;      ulong xSub2 = 0;      ulong value = 0;      while (x
页: [1]
查看完整版本: 为了性能,慎用递归