您的位置:首页 > 其它

不要迷信非递归算法

2009-07-07 13:07 253 查看
关于什么是递归和为什么递归效率低下,可参照《数据结构》。
我想告诉您的是:编写Java代码时,不要迷信非递归算法。
递归的好处是:把大规模的问题分解成小规模的问题,直至浅显易懂、可立即求解。
写Java代码时,递归有可能比非递归更快。可能是因递归调用经由JVM内部实现时,JVM对它进行了算法优化。如果您有更好的解释,请告诉我(weilai2@163.com)
为此,我做过测试,以下是测试数据:
树的结点类型是TreeNode0(自定义的),10万次遍历(CPU双核2.66G) , 2009-1-1
当有22 个结点时,树最深处有5 层,递归遍历耗时0.188秒, 非递归遍历耗时0.625秒。
当有40 个结点时,树最深处有4 层,递归遍历耗时0.35 秒, 非递归遍历耗时1.13 秒。
当有133个结点时,树最深处有13层,递归遍历耗时1.031秒, 非递归遍历耗时3.625秒。
当有790个结点时,树最深处有62层,递归遍历耗时6.56 秒, 非递归遍历耗时11.62秒。
主要的测试代码如下:
/**traverse recursively. 递归实现. */
public static <T extends TreeNode0<T>> List<T> traverse_recursive(T root,
NodeFilter<T> filter, List<T> returnList) {
if (filter == null || filter.test(root)) {
list.add(root);
}
Stack<T> sons = root.sons;
if (sons != null) {
for (int i = sons.size() - 1; i >= 0; i--) {
T son = sons.get(i);
traverse_recursive(son, filter, returnList);
}
}
return returnList;
}

/**depth first traversal.非递归实现.*/
public static <T extends TreeNode0<T>> List<T> traverse_DFT(T root,
NodeFilter<T> filter) {
Stack<T> st = new Stack<T>();
st.push(root);
List<T> list = new ArrayList<T>();
while (!st.isEmpty()) {
T dad = st.pop();
if (filter == null || filter.test(dad)) {
list.add(dad);
}
Stack<T> sons = dad.sons;
if (sons != null) {
for (int i = sons.size() - 1; i >= 0; i--) {
T son = sons.get(i);
st.push(son);
}
}
}
return list;
}


end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: