C 如何理解这个函数的递归性?

C 如何理解这个函数的递归性?,c,arrays,string,function,recursion,C,Arrays,String,Function,Recursion,这是一个程序,用于查找在任何位置插入的最少字符数,以将给定字符串转换为回文。有人能给我解释一下回文函数内部的细节吗?我很难理解在else条件中再次调用的递归函数。谢谢大家! 包括 包括 内部最小值a,内部最小值b { ifa>b 返回b; 其他的 返回a; } int回文字符字符串[],int l,int h { 如果l>=h 返回0; ifstring[l]==字符串[h] 返回回文字符串,l+1,h-1; 其他的 { int choice1=1+回文字符串,l+1,h; int choi

这是一个程序,用于查找在任何位置插入的最少字符数,以将给定字符串转换为回文。有人能给我解释一下回文函数内部的细节吗?我很难理解在else条件中再次调用的递归函数。谢谢大家!

包括 包括 内部最小值a,内部最小值b { ifa>b 返回b; 其他的 返回a; } int回文字符字符串[],int l,int h { 如果l>=h 返回0; ifstring[l]==字符串[h] 返回回文字符串,l+1,h-1; 其他的 { int choice1=1+回文字符串,l+1,h; int choice2=1+回文字符串,l,h-1; 返回minchoice1,choice2; } } int main { 字符串[20]; 打印机字符串:; 扫描%s,字符串; printf%d,回文字符串,0,strenstring-1; 返回0; }
这段代码解决了以下问题:

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

我们可以通过一系列的观察来解决这个问题。首先,请注意任何长度为0或1的字符串都已经是回文。因此,如果要求我们向长度为0或1的字符串中添加字符,那么我们根本不需要添加任何字符。我们已经有了回文!这就是我们的基本情况:

基本大小写:任何长度为0或1的字符串都不需要添加字符来生成回文

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

让我们从字符串的第一个和最后一个字符开始。要么匹配,要么不匹配。在他们匹配的情况下,我们的状态很好!我们不需要添加任何特定的字符来使这两个字符相互匹配。在这一点上,我们所要做的就是确保剩下的字符——内部的字符——相互匹配。这为我们提供了另一个简单的案例:

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

另一方面,我们可能有一个第一个和最后一个字符不匹配的字符串。这意味着,我们从示意图上看一个字符串,看起来像这样:

a-----b

现在,怎样才能使这个字符串成为回文?好的,我们必须插入至少一个字符,以使内容匹配,因为我们需要使第一个和最后一个字符相同。不过,我们有两种不同的方法可以做到这一点。第一个选项是在字符串末尾附加一个a,如下所示:

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

如果我们在这里加了一个a,那么,使用上面的规则,我们会说第一个字符和最后一个字符匹配,所以我们可以去掉第一个字符和最后一个字符,看看剩下的是什么:

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

这样做的最终效果是,通过向字符串中添加一个字符,我们基本上放弃了字符串的第一个字符,即原始a。从这里开始,我们希望尽一切可能使字符串的其余部分成为回文

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

b a-----b

在这里,我们可以将新的b与旧的b进行匹配,如下所示:

a--------

这需要我们添加一个字符,然后我们要递归地计算出需要添加到字符串其余部分以使其成为回文的最少字符数

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

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

现在您已经看到了这个描述,您能将这个基本情况和两个递归步骤映射到您与我们共享的代码上吗


希望这有帮助

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

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

有一个 我们可以做一组很好的观察来解决这个问题。首先,请注意任何长度为0或1的字符串都已经是回文。因此,如果要求我们向长度为0或1的字符串中添加字符,那么我们根本不需要添加任何字符。我们已经有了回文!这就是我们的基本情况:

基本大小写:任何长度为0或1的字符串都不需要添加字符来生成回文

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

让我们从字符串的第一个和最后一个字符开始。要么匹配,要么不匹配。在他们匹配的情况下,我们的状态很好!我们不需要添加任何特定的字符来使这两个字符相互匹配。在这一点上,我们所要做的就是确保剩下的字符——内部的字符——相互匹配。这为我们提供了另一个简单的案例:

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

另一方面,我们可能有一个第一个和最后一个字符不匹配的字符串。这意味着,我们从示意图上看一个字符串,看起来像这样:

a-----b

现在,怎样才能使这个字符串成为回文?好的,我们必须插入至少一个字符,以使内容匹配,因为我们需要使第一个和最后一个字符相同。不过,我们有两种不同的方法可以做到这一点。第一个选项是在字符串末尾附加一个a,如下所示:

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

如果我们在这里加了一个a,那么,使用上面的规则,我们会说第一个字符和最后一个字符匹配,所以我们可以去掉第一个字符和最后一个字符,看看剩下的是什么:

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

这样做的最终效果是,通过向字符串中添加一个字符,我们基本上放弃了字符串的第一个字符,即原始a。从这里开始,我们希望尽一切可能使字符串的其余部分成为回文

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

b a-----b

在这里,我们可以将新的b与旧的b进行匹配,如下所示:

a--------

这需要我们添加一个字符,然后我们要递归地计算出需要添加到字符串其余部分以使其成为回文的最少字符数

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

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

现在您已经看到了这个描述,您能将这个基本情况和两个递归步骤映射到您与我们共享的代码上吗


希望这有帮助

要理解递归,您必须首先理解递归对不起,无法抗拒:遗憾的是,它不能正常工作。当我给它wewtrert时,它会打印3,因为最短的回文应该是1。当我给它ewtrert时,它将2打印为最短的回文,但这需要一个双字母。当我给它wocteyr它打印6作为最短的长度。它似乎在试图找到一个两端都被裁剪的回文,左边被裁剪,然后右边被裁剪。@WeatherVane我认为问题不在于找到嵌入回文最长的长度,而是找到最少数量的需要添加的字符,以使原始字符串成为回文。@WeatherVane如前所述,我试图找到可以插入的最少字符数,以使世界回文。假设你有一个单词mykma,你应该在'm'前面加一个字母a,在'y'前面加一个字母k,所以最后你有一个回文amkykma。因此,使mykma回文的最少字符数是2。希望这能澄清一切。@usr我知道你在那里做了什么;但是,嘿,让我休息一下,我对这东西是新手:要理解递归,你必须首先理解递归对不起,无法抗拒:很遗憾,它不能正常工作。当我给它wewtrert时,它打印3作为sho
rtest回文数应该是1。当我给它ewtrert时,它将2打印为最短的回文,但这需要一个双字母。当我给它wocteyr它打印6作为最短的长度。它似乎在试图找到一个两端都被裁剪的回文,左边被裁剪,然后右边被裁剪。@WeatherVane我认为问题不在于找到嵌入回文最长的长度,而是找到最少数量的需要添加的字符,以使原始字符串成为回文。@WeatherVane如前所述,我试图找到可以插入的最少字符数,以使世界回文。假设你有一个单词mykma,你应该在'm'前面加一个字母a,在'y'前面加一个字母k,所以最后你有一个回文amkykma。因此,使mykma回文的最少字符数是2。希望这能澄清一切。@usr我知道你在那里做了什么;但是,嘿,让我休息一下,我对这个东西还不熟悉:啊,我不明白这个问题。@templatetypedef我理解这个想法,我只是不理解这两个:int choice1=1+回文字符串,l+1,h;int choice2=1+回文字符串,l,h-1;完成。确认:您的问题是,当进行两个不同的递归调用而不是一个递归调用时,递归如何工作?@templatetypedef是的,没错!回答得很好@多个递归函数上的c0mp13x可能会对您有所帮助。它是葡萄牙语的,但是您可以看到堆栈跟踪。函数是double-fib-double n{return n==0 | | n==1?1:fibn-1+fibn-2;}是的,我不明白这个问题。@templatetypedef我理解这个想法,只是不理解这两个函数的实现:int-choice1=1+回文字符串,l+1,h;int choice2=1+回文字符串,l,h-1;完成。确认:您的问题是,当进行两个不同的递归调用而不是一个递归调用时,递归如何工作?@templatetypedef是的,没错!回答得很好@多个递归函数上的c0mp13x可能会对您有所帮助。它是葡萄牙语的,但是您可以看到堆栈跟踪。函数是double fib double n{返回n==0 | | n==1?1:fibn-1+fibn-2;}