检查字符串中的数字是否对称(在边缘)

时间:2016-03-01 10:51:33

标签: c string recursion palindrome

我有一串数字。我需要检查边缘上的数字是否是对称的,这意味着当模数为2时它们具有相同的余数。

我已经编写了一个可以运行的代码,但是我遇到了一些令我不安的问题,在经过一些失败之后我已经提出了这个代码:

int PaliPair(char* st, int n)
{
  if(n<=1) return 1;
  return (*st%2 == *(st+n-1)%2) && PaliPair(st +1, n-2);
}

问题是,为什么我必须返回n-2而不是n-1?我有点困惑为什么它有效。任何解释都将受到高度赞赏。我想我错过了一些东西,也许是字符串以"\0"结尾的事实,我需要从中得出结论。

2 个答案:

答案 0 :(得分:3)

如果你有一个像这样的字符串

"1243"

然后你首先检查第一个和最后一个字符。

然后你需要检查中间的字符

"24"

因此,目标字符串现在的长度为4 - 2(已经检查过的字符数)

所以在每次递归中你检查2个字符,在下一个递归中你需要检查2个字符。

至于函数本身,我会像

一样写
int PaliPair( const char *s, size_t n )
{
   return n < 2 || *s % 2 == *( s + n - 1 ) % 2 && PaliPair( s + 1, n - 2 );
}

甚至喜欢

int PaliPair( const char *s, size_t n )
{
   return n < 2 || ( *s - '0' ) % 2 == ( *( s + n - 1 ) - '0' ) % 2 && PaliPair( s + 1, n - 2 );
}

答案 1 :(得分:2)

假设您的字符串为21312,首先您将从两端比较2和2。然后你使用st+1向前迈出一步,你应该考虑131,所以你不应该从字符串的开头和结尾开始考虑2,这是&#39}为什么要n-2

通过这种方式,你可以从字符串的开头向前移动一个字符,但是你也应该从字符串的末尾向后移动一个字符。 我希望你明白我的观点。