C# 递归回文检查
我正在学习递归,并试图进行回文检查。它不起作用。有人能帮我找出原因吗C# 递归回文检查,c#,recursion,C#,Recursion,我正在学习递归,并试图进行回文检查。它不起作用。有人能帮我找出原因吗 private static bool CheckPalin(string p) { if(p.Length == 1 || p.Length == 0) //added check for even cases return true; if(p[0] != p[p.Length -1]) return false; CheckPalin(p.SubsString(
private static bool CheckPalin(string p)
{
if(p.Length == 1 || p.Length == 0) //added check for even cases
return true;
if(p[0] != p[p.Length -1])
return false;
CheckPalin(p.SubsString(1, p.Length -2));
return true;
}
如果
p.Length==0
,会发生什么情况
您的代码可能返回false或崩溃,而它应该返回true。或者,在调用CheckPalin之前和确认p[0]==p[p.Length-1]
之后,当p.Length==2时返回true
你也不明白递归是如何工作的。你的最后一行应该是
return CheckPalin(p.SubsString(1, p.Length -2));
如果p.Length==0
,会发生什么情况
您的代码可能返回false或崩溃,而它应该返回true。或者,在调用CheckPalin之前和确认p[0]==p[p.Length-1]
之后,当p.Length==2时返回true
你也不明白递归是如何工作的。你的最后一行应该是
return CheckPalin(p.SubsString(1, p.Length -2));
致:
致:
头部呈方形(正如我关于aa
--长度0
字符串会给你带来麻烦的问题所暗示的那样)
另一个失败案例,如误报所示,一旦您快速后退一步并寻找它,实际上是非常明显的:
CheckPalin(p.SubsString(1, p.Length -2));
return true;
尝试:
太神奇了,我浏览了两遍都没注意到——直到你指出了误报。:) 头上的正方形(正如我关于aa
--长度0
字符串会给你带来麻烦的问题所暗示的那样)
另一个失败案例,如误报所示,一旦您快速后退一步并寻找它,实际上是非常明显的:
CheckPalin(p.SubsString(1, p.Length -2));
return true;
尝试:
太神奇了,我浏览了两遍都没注意到——直到你指出了误报。:) 哪些测试输入有效?哪些测试输入失败?如果将aa
作为输入传递,会发生什么情况?添加一行以在每次通过循环时打印“p”,或手动设置断点并逐步通过每个循环否。我在努力学习。这就是我没有用谷歌搜索答案的原因。哪些测试输入有效?哪些测试输入失败?如果将aa
作为输入传递,会发生什么情况?添加一行以在每次通过循环时打印“p”,或手动设置断点并逐步通过每个循环否。我在努力学习。这就是我没有用谷歌搜索答案的原因。谢谢你指出。我当然还不知道递归(错过了。谢谢你指出。我肯定还不知道递归。:(谢谢,我错过了一个终止条件和递归的概念。:(它肯定需要几次尝试才有意义。:)我对展开部分不是很确定。假设我有一个字符串“irbeyuibri”。当它检查“e”!=“i”时,它返回false。之后会发生什么?当我追踪代码时,它会继续用“beyuib”、“rbeyuibr”和“irbeyuibri”来点击CheckPalin调用。再后退一步,你会发现false
会一直传播到原始调用:bool palin=CheckPalin(“irbeyuibri”);
--
palin
也将是false
。好的,看起来我明白了。非常感谢!啊,事实上,它不再调用,只是返回以前调用的值。谢谢,我错过了一个终止条件和递归的概念。(它肯定需要尝试几次才有意义。)我不太确定解绕部分。假设我有一个字符串“irbeyuibri”。当它检查“e”!=“I”时,它返回false。之后会发生什么?当我跟踪代码时,它会继续用“beyuib”、“rbeyuibr”和“irbeyuibri”来点击CheckPalin调用“。再后退一步,您会发现false
会一直传播到原始调用:bool-palin=CheckPalin(“irbeyuibri”)
--palin
也将是false
。好的,看起来我明白了。非常感谢!啊,事实上,它不再调用,只是返回以前调用的值。
return CheckPalin(p.SubsString(1, p.Length -2));