王小泉*_*王小泉 0 c++ recursion palindrome
bool isPalindromeIterative(const char *s1){
int len=strlen(s1)-1;
if(len>0)
if(s1[0]==s1[len]){
len-=2;
isPalindromeIterative(s1+1);
}
else
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我正在写关于Palindrome的文章.当我运行它时,它会出现如下警告:
":79:13:警告:添加明确的括号以避免悬挂其他[-Wdangling-else]"
请帮我 !谢谢!
当你写作时,
if(len>0)
if(s1[0]==s1[len]){
// This has no effect on the recursive call.
len-=2;
// You missed the return in your post.
return isPalindromeIterative(s1+1);
}
else
return false;
Run Code Online (Sandbox Code Playgroud)
您很可能打算将 theelse与第二个关联起来if。
if(len>0)
{
if(s1[0]==s1[len])
{
return isPalindromeIterative(s1+1);
}
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器不使用缩进来解决这个问题。从编译器编写者的角度来看,您可能打算将else与第一个相关联if:
if(len>0)
{
if(s1[0]==s1[len])
{
return isPalindromeIterative(s1+1);
}
}
else
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
由于这是开发人员常犯的错误,因此编译器会向您发出警告,并希望您更新代码,以便它不太可能变成运行时错误。
我想指出的是,您用来检测字符串是否是回文的递归逻辑是错误的。
假设您的字符串是“abxba”。
在第一次迭代中,您'a'与进行比较'a'。
在下一次迭代中,您'b'与进行比较'a',这是不正确的。你最终会得到错误的答案。
你必须稍微改变你的策略。使用:
bool isPalindromeIterative(const char *s1, int start, int end)
{
if ( start >= end )
{
return true;
}
if ( s1[start] == s1[end] )
{
return isPalindromeIterative(s1, start+1, end-1)
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
迭代调用的开始必须如下所示:
isPalindromeIterative(s1, 0, strlen(s1)-1);
Run Code Online (Sandbox Code Playgroud)
代码正式没有任何问题,除非您希望else匹配外部代码if.一个常见的错误.
如果你在任何地方添加大括号,你会明白你的意图:
if(len>0)
{
if(s1[0]==s1[len])
{
len-=2;
isPalindromeIterative(s1+1);
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)