为了性能,慎用递归

莱莱  金牌会员 | 2023-12-22 09:04:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 885|帖子 885|积分 2655

慎用递归

起因:

在学习Rust的时候,有一道语法练习题是计算斐波那契数列的第N项的值,这是一道非常简单的题,但是引发了一个使用递归性能问题,考虑到用Rust的人不多,后面的代码都是C#的,因为C#的语法更大众一些,更好看懂
第一次解
  1. public static ulong FibonacciNumberRecursion(int n)
  2. {
  3.     if (n == 1)
  4.         return 0;
  5.     else if (n == 2)
  6.         return 1;
  7.     else
  8.     {
  9.         return FibonacciNumberRecursion(n - 1) + FibonacciNumberRecursion(n - 2);
  10.     }
  11. }
复制代码
这个写法非常的符合大脑思考,第一项返回0,第二项返回1,后面的返回前两项之和,简单测试没有任何问题。但是,这个算法有非常严重的性能问题,当n到40的时候,计算速度已经到了肉眼不可接受的地步,再往上就到了分钟级的了,造成运行缓慢的原因,就是递归会不停的压栈,存储当前的状态,这是非常没有必要的,于是我写了第二种解法
第二次解

[code]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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表