【问题描述】(专业领域问题,保密起见此处省略……)

【模型】

data[][]={
{0, 100, 200, 300},
{0, 50, 100},
{0, 150, 300},
{0, 100, 200, 300, 400,}
}
//2维数组data,M行,每一行代表一组数据,每组数据内有序

//要求:从每一组数据中,取出且仅仅取出一个数,然后使这些数据的和满足[MIN, MAX]范围。

这是最近同学遇到的一个问题,开始先用非递归方法实现的,后来为了比较递归和非递归的区别,又用递归方法实现了。

先说说非递归方法,我的思路是:肯定要遍历各组数据之间的所有组合,即任意Xi属于组Si(i=0,1,2,....,M-1),{X1,X2,...,X(M-1)}的所有组合。当然,因为各组数据之内有序,可以在遍历过程中增加判断,如果当前的和已经大于M,则可以结束当前循环,以及后面的判断。采用数组INDEX[0---M-1]来记录每一行当前循环的index,如果后面的i行的index已经达到该行的最大index,则i-1行加一。及类似数字进位原理。(后来听同学说,这样也可以解决多层循环的问题)。 

  1[算法]一个关于组合的算法package swing;
  2[算法]一个关于组合的算法
  3[算法]一个关于组合的算法import java.util.ArrayList;
  4[算法]一个关于组合的算法
  5[算法]一个关于组合的算法
  6}

后来又用递归实现了,发现用递归实现反而思路更加简单,而且也好理解。就是从第一行到最后一行,每行取一个数,直到最后一行取了或者前面之和已经大于MAX为止。但是回退时要注意减掉上一次加的那个数。

  1[算法]一个关于组合的算法package swing;
  2[算法]一个关于组合的算法
  3[算法]一个关于组合的算法import java.util.ArrayList;
  4[算法]一个关于组合的算法
  5[算法]一个关于组合的算法
  6[算法]一个关于组合的算法
  7}

经过用两种方法对相同的数据进行测试,发现递归的程序明显比非递归的程序快。原因初步分析如下:虽说递归涉及到多次的函数调用,即进栈出栈的操作,但是因为函数调用使用栈,而非在堆中,因此速度比在非递归时使用的在堆中分配的数据要快。当然,这也许和我写的非递归算法有关。

关于递归与非递归的使用以及转换和效率问题,最近抽空研究下。

====================================================================================================

added on 2009-11-17

经测试,非递归算法之所以这么慢,是因为我在程序中处理“进位”时,使用了除法和取余操作,而这两种操作相对加法和比较来说,是比较费时的。经改进算法,程序已经达到和递归差不多的速度。看来以后写程序得注意了,如果能有替代方案,尽量少用乘除操作。虽然计算少的时候效果看不出来,

最近对递归和非递归看了下,感觉递归思想确实易理解,而且程序简练,但是也存在许多问题,比如多次函数调用导致耗资源,不便于控制处理过程等。所以以后还是能不用递归就不用了吧。

相关文章:

  • 2022-12-23
  • 2021-12-04
  • 2022-01-16
  • 2021-12-07
  • 2022-03-07
  • 2021-07-13
猜你喜欢
  • 2021-07-17
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2021-06-09
相关资源
相似解决方案