【问题标题】:Removing Tail-Recursion from Method (Java)从方法中删除尾递归(Java)
【发布时间】: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


【解决方案1】:

这就是你所追求的(大小为 n 的字母表的排列):

private static String computePerm(int iteration) {
    return Integer.toString(iteration, n);
}

【讨论】:

  • 我认为这根本不是我想要的。对不起。
  • computePerm() 生成您的字母表的排列,其大小为 n,对吗?我假设您正在使用它来生成令牌对来测试您的解决方案。 Integer.toString(i, radix) 和你的方法做同样的事情。如果您想要一个针对您的问题的迭代解决方案的示例,请查看它的源代码,或者如果您只需要它来设置测试数据,则只需使用该调用。
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多