递归算法与优化后的算法对比

开发 前端 算法
前段时间看了《【面试】——反应迟钝的递归》中的三个递归算法,斐波那契数列优化后的算法思路确实不错,但是后面2个数列用递归的话,个人感觉有点得不偿失。能不用递归的话,尽量不用,因为有些算法完全可以用数学来解决。因此,本文中将这三个数列的最终算法总结如下。

前段时间看了《【面试】——反应迟钝的递归》中的三个递归算法,斐波那契数列优化后的算法思路确实不错,但是后面2个数列用递归的话,个人感觉有点得不偿失。能不用递归的话,尽量不用,因为有些算法完全可以用数学来解决。因此,本文中将这三个数列的最终算法总结如下。

1、计算数组1,1,2,3,5,8,13...第30位的值

递归算法如下:

  1. public static int CalculateFibonacciSequence(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             if (index == 1 || index == 2)  
  9.             {  
  10.                 return 1;  
  11.             }  
  12.  
  13.             return CalculateFibonacciSequence(index - 1) + CalculateFibonacciSequence(index - 2);  
  14.         } 

用递归算法来计算的话,有很多重复性的操作,采用数组相对来说,效率更高,最终算法如下:

  1. public static int CalculateFibonacciSequence(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             if (index == 1 || index == 2)  
  9.             {  
  10.                 return 1;  
  11.             }  
  12.  
  13.             int[] fibonacciArray = new int[index];  
  14.             fibonacciArray[0] = 1;  
  15.             fibonacciArray[1] = 1;  
  16.  
  17.             for (int innerIndex = 2; innerIndex < fibonacciArray.Length; innerIndex++)  
  18.             {  
  19.                 fibonacciArray[innerIndex] = fibonacciArray[innerIndex - 1] + fibonacciArray[innerIndex - 2];  
  20.             }  
  21.  
  22.             return fibonacciArray[index - 1];  
  23.         } 

对于斐波那契数列,通用公式为Fn=F(n-1)+F(n-2)(n>=2,n∈N*),直接循环计算一次就可以获得所需的值。

2、计算1+2+3+4+...+n的值

递归算法如下:

  1. public static int CalculateNumberSequenceCount(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             return CalculateNumberSequenceCount(index - 1) + index;  
  9.         } 

当数字(index)很大时,用上面的递归算法肯定是有问题的,我们看下最终的算法,如下所示:

  1. public static int CalculateNumberSequenceCount(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             return index * (index + 1) / 2;  
  9.         } 

对于1+2+3+4+...+n,完全是高中数学的等差数列求和的一个特例。1+2+3+4+......+n等于(首项+末项)*项数/2,所以结果为n(n+1)/2 。这个完全可以不用递归来进行计算,公式套用一下就解决了。

3、计算1-2+3-4+5-6+7+...+n的值

递归算法如下:

  1. public static int CalculateNumberSequence(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             return index % 2 == 0 ? CalculateNumberSequence(index - 1) - index : CalculateNumberSequence(index - 1) + index;  
  9.         } 

对于1-2+3-4+5-6+7+...+n,可以分为2种情况,分别为:

(1)当n是偶数时,1-2+3-4+5-6+7+...+n=(1-2)+(3-4)+(5-6)+……+[(n-1)-n]

=-1×(n/2)

=-n/2

(2)当n是奇数时,1-2+3-4+5-6+7+...+n=(1-2)+(3-4)+(5-6)+……+[(n-2)-(n-1)]+n

=-1×(n-1)/2 +n

=(n+1)/2

因此,最终的算法如下:

  1. public static int CalculateCrossNumberSequence(int index)  
  2.         {  
  3.             if (index <= 0)  
  4.             {  
  5.                 return 0;  
  6.             }  
  7.  
  8.             return index % 2 == 0 ? -index / 2 : (index + 1) / 2;  
  9.         } 

能够用数学解决的问题,尽量不要用递归来进行计算。当然,很多情况还是需要用递归的。这里并不是说递归算法不好,只能说具体问题采用***方式来解决才是最终的方案,希望对各位有所帮助。

原文:http://www.cnblogs.com/jasenkin/archive/2012/02/22/recursion_math_algorithm_comparion.html

【编辑推荐】

  1. Matt Cutts博文:谷歌算法的十项***调整
  2. 从简单的算法初探汇编语言
  3. 算法学习之动态规划策略入门
  4. 百度调整搜索引擎算法 增强微博内容索引
  5. Google算法十年变迁史
责任编辑:陈贻新 来源: 王胜的博客
相关推荐

2023-06-14 18:41:42

模型人工智能机器学习

2009-11-17 16:53:24

PHP递归算法

2012-08-01 09:51:37

递归算法

2020-07-10 08:15:19

递归算法函数

2021-04-13 09:37:41

Java数据结构算法

2009-11-30 09:35:15

PHP递归算法

2009-11-18 16:47:50

PHP递归算法

2018-05-14 12:30:37

数据驱动算法优化

2022-10-28 09:15:02

2022-10-28 08:31:43

2019-09-18 10:12:37

递归数据结构

2014-06-05 10:22:06

Tomcat 7

2021-09-15 07:40:50

二叉树数据结构算法

2009-09-02 18:39:34

C#递归算法

2020-10-14 08:32:08

算法递归面试

2014-04-04 11:14:18

JavaScriptStack递归

2023-04-27 09:13:20

排序算法数据结构

2022-08-28 20:50:29

算法模型机器学习

2011-07-11 15:26:49

性能优化算法

2023-03-08 08:03:09

数据结构算法归并排序
点赞
收藏

51CTO技术栈公众号