当前位置: 首页 > 面试题库 >

将递归函数转换为for循环?

张瀚漠
2023-03-14
问题内容

是否每个递归函数都有一个等效的for循环?(两者都达到相同的结果)。

我有这个递归函数:

private static boolean recur(String word, int length) {
    if(length == 1 || length == 2)
        return false;
    if(length == 0)
        return true;
    if(words[length].contains(word.substring(0, length)))
        return recur(word.substring(length), word.length() - length);
    return recur(word, length-1);
}

假设单词是Set [],并且单词[i] =单词长度为i的集合。

我想做的是:使用一个单词(例如,“ stackoverflow”,没有空格)启动递归,我试图查找该单词是否可以切成子单词(“ stack”,“
over”,“ flow”) ..子词的最小长度为3,并且假设长度为i的子词在Set words [i]中。

我可以确认此代码有效,但可能存在内存问题,因此,如果可能,我想将其转为循环。

您需要更多信息吗?

谢谢。


问题答案:

尾递归总是可以展开到循环中,并且您的代码 非常接近 尾递归,所以可以。

private static boolean recur(String word, int length) {
    if(length == 1 || length == 2)
        return false;
    if(length == 0)
        return true;
    int nextLength;
    String nextWord;
    if(words[length].contains(word.substring(0, length))) {
      nextWord = word.substring(length);
      nextLength = word.length() - length;
    } else {
      nextWord = word;
      nextLength = length - 1;
    }
    return recur(nextWord, nextLength);
}

现在这是正确的尾递归。现在将其变成循环:

private static boolean recur(String word, int length) {
    int nextLength = length;
    String nextWord = word;
    while( true ) {
        if(nextLength == 1 || nextLength == 2)
            return false;
        if(nextLength == 0)
            return true;
        if(words[nextLength].contains(nextWord.substring(0, nextLength))) {
            nextWord = nextWord.substring(nextLength);
            nextLength = nextWord.length() - nextLength;
        } else {
            nextWord = nextWord;
            nextLength = nextLength - 1;
        }
    }
}

请注意,可以进一步优化此代码,我只是想演示将递归转换为循环的“自动”方法。



 类似资料:
  • 我有一个关于如何将“递归”转换为“尾部递归”的问题。 这不是家庭作业,只是在我试图润色算法书籍中的递归定理时出现的一个问题。 我熟悉使用递归的两个典型示例(阶乘和斐波那契序列),也知道如何以递归方式和尾部递归方式实现它们。 我的代码如下(我使用Perl只是为了使其简单,但可以轻松地转换为C/Java/C)。 运行代码时,输出如下: 递归函数在返回之前使用不同的参数调用自己两次。我尝试了几种方法将其

  • 嗯,我已经试过多次了。不过,我一度认为最长的序列函数会有所帮助,因为它显示的是最长的冰雹序列。尽管如此,我似乎不知道如何查找或存储它用于查找的值。如果有人能解释一下,我将不胜感激。 我遇到的问题是我最长的启动顺序: 我不知道如何将其转换为递归,我注意到对于一些递归,我看到人们仍然在使用for循环,但我确信我们不应该使用循环。这可能是一个愚蠢的问题,但如果有人知道的话,有没有一个公式可以将循环转换为

  • 我们正在获取具有以下字段的订单数据(仅显示相关字段) 具有NULLoriginal_orderid的订单可以被认为是父订单 其中一些父母订单可能有子订单,子订单的original_orderid映射到父母的订单。 子顺序可以产生另一个子顺序,如图像所示,带有颜色编码。 与原始文本相同的数据: 作为转换,我们需要将所有子节点映射到它们的原始父节点(original_orderid为NULL),并获得

  • 我有一个低效的递归硬币变化函数,它计算出给定数量的硬币组合数量。如果可能的话,我想把它转换成一个更有效的迭代函数。 一个问题是,我正在使用回溯来尝试一个叫做面额的数组中的不同硬币。我也在使用记忆法,但当数量很大时,它不会加快速度。 这是我的密码: 有什么想法可以做到这一点吗?我知道有解决硬币更换问题的DP解决方案,但我的解决方案并不容易。我可以有半个便士。 *更新:我将函数改为迭代函数,并将其放大

  • 我需要在 ML 中编写自己的递归函数,该函数以某种方式使用 ord 将一串数字转换为整数类型。我可以使用辅助函数,但显然我应该能够在不使用辅助函数的情况下做到这一点(根据我的教授的说法)。 我可以假设输入是有效的,并且是一个正整数(当然是字符串类型)。 因此,调用str2int("1234")应该输出1234: int 我假设我需要在某个时候使用爆炸和内爆,因为 ord 对字符进行操作,而我的输入