繁体   English   中英

如何理解这个 function 的递归性?

[英]How to understand the recursiveness of this function?

这是一个程序,用于查找应插入(在任何位置)的最少字符数,以将给定字符串转换为回文。 有人可以向我解释回文 function 中发生的更详细的情况吗? 我很难理解在 else 条件下再次调用递归 function 。 谢谢!

#include <stdio.h>
#include <string.h>


int min(int a, int b) 
{ 
    if(a > b)
        return b;
    else
        return a;
} 

int palindrome(char string[], int l, int h) 
{
    if (l >= h)
        return 0; 
    if(string[l] == string[h])
        return palindrome(string, l+1, h-1);
    else
    {
        int choice1 = 1 + palindrome(string, l+1, h);
        int choice2 = 1 + palindrome(string, l, h-1);
        return min(choice1, choice2);
    }  
} 

int main() 
{ 
    char string[20];
    printf("ENTER STRING: ");
    scanf("%s", string);
    printf("%d", palindrome(string, 0, strlen(string) - 1)); 
    return 0; 
} 

这段代码解决了以下问题:

给你一个字符串。 您必须在其中插入多少个字符才能使其成为回文?

我们可以通过一组很好的观察来解决这个问题。 对于初学者,请注意任何长度为零或一的字符串已经是回文。 因此,如果我们被要求向长度为 0 或 1 的字符串添加字符,那么我们根本不需要添加任何字符。 我们已经有了一个回文:这给了我们我们的基本情况:

基本情况:任何长度为零或一的字符串都不需要添加字符来构成回文。

相反,假设我们的字符串中有两个或更多字符。 要让它成为回文,它的第一个和最后一个字符必须相互匹配 - 否则,它不是回文。 要使我们的字符串变成回文,还必须发生很多其他事情,但是如果第一个字符和最后一个字符不匹配,我们就有麻烦了。

因此,让我们从查看字符串的第一个和最后一个字符开始。 他们要么匹配,要么不匹配。 在他们匹配的情况下,我们处于良好状态。 我们不需要添加任何特定字符来专门让这两个字符相互匹配,此时。 我们所要做的就是确保剩余的字符——里面的那些——相互匹配:这给了我们另一个简单的例子来考虑:

递归案例 1:如果字符串的第一个和最后一个字符匹配,则假装它们不存在,然后递归计算需要多少个字符才能使字符串的中间字符成为回文。

另一方面,我们可能有一个字符串,其中第一个字符和最后一个字符不匹配。 这意味着我们正在示意性地查看一个看起来像这样的字符串:

a - - - - - - - - - - - - - - - - - - b

现在,要使这个字符串成为回文,必须发生什么? 好吧,我们将不得不插入至少一个字符以使事情匹配,因为我们需要使第一个和最后一个字符相同。 不过,我们有两种不同的方法可以做到这一点。 第一个选项是 append 到字符串末尾的a ,如下所示:

a - - - - - - - - - - - - - - - - - - b a

如果我们确实在这里放了一个a ,那么,使用上面的规则,我们会说第一个和最后一个字符匹配,所以我们可以删除第一个和最后一个字符并查看剩下的内容:

- - - - - - - - - - - - - - - - - - b

这样做的最终效果是,我们通过在字符串中再添加一个字符,基本上丢弃了字符串的第一个字符(原来的 a )。 从这里开始,我们想尽一切可能使字符串的 rest 成为回文。

另一种选择是将b放在字符串的前面:

b a - - - - - - - - - - - - - - - - - - b

在这里,我们可以匹配这个新的b和旧的 b,给出:

a - - - - - - - - - - - - - - - - - -

这需要我们添加一个字符,然后我们想(当然是递归地)找出需要添加到字符串的 rest 以使其成为回文的最少字符数。

总的来说,这给了我们以下规则:

递归案例 2:如果第一个字符和最后一个字符不匹配,那么我们需要在前面或后面再添加一个字符以使它们匹配。 因此,尝试删除字符串的第一个字符并查看从那里开始的最佳方式,然后删除字符串的最后一个字符并从那里查看最佳选项,然后选择更好的选项。 不要忘记为我们插入的字符加 1!

既然你已经看到了这个描述,你能 map 这个基本案例和你与我们共享的代码的两个递归步骤吗?

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM