【发布时间】:2016-11-23 11:12:15
【问题描述】:
我有这个方法:
private String computePerm(int iteration) {
if (iteration < n + 1) {
return Character.toString((char) (iteration + 48));
} else {
if (iteration % n == 0) {
return computePerm((iteration / n) - 1) + computePerm(((iteration - 1) % n + 1));
} else {
return computePerm(iteration / n) + computePerm(iteration % n);
}
}
}
它计算由单个广度优先搜索遍历引起的排列。我用它来解决Post's correspondence problem。但是,我怀疑它是尾递归的,并且在某些问题实例上似乎会产生丑陋的开销。
如何在保留方法行为的同时移除尾递归?
【问题讨论】:
-
您的方法中有 4 个递归调用。这不是尾递归。
-
@shmosel 那么我如何首先删除递归?老实说,我似乎不能那样做,因为我怀疑它会快很多。
-
谁说你可以?为什么你确信它会更快?
-
@shmosel 我不相信任何事情,但根据我的经验,Java 中的递归往往相当昂贵,而不仅仅是循环。
标签: java optimization tail-recursion