是否可以使用以下参数列表定义回文检查的递归方法?
int testPalindromeRecursive(char* str, int len) { ... }
注意:不必使用外部子函数或全局变量
我认为这是不可能的,因为你必须以某种方式记住最后一个(前面)索引位置。
答案 0 :(得分:8)
是的,完全有可能 - 正如几个人所提到的那样。
基础案例:
另外:用(str + 1,len -2)
递归答案 1 :(得分:1)
1)没有字符或只有一个字符的字符串是回文
2)如果包含2个或更多字符的字符串的第一个和最后一个字符相等,并且不包括终端字符的子字符串是回文,则整个字符串是palindrone。
答案 2 :(得分:1)
至于我,那么我会声明像
这样的函数int testPalindromeRecursive( const char *s, size_t n );
在这种情况下,该函数只包含一个return语句
int testPalindromeRecursive( const char *s, size_t n )
{
return ( n < 2 ) ||
( s[0] == s[n-1] && testPalindromeRecursive( s + 1, n - 2 ) );
}
然而,该功能可以通过以下方式显示,如下面的示范程序所示
#include <stdio.h>
int testPalindromeRecursive( char *str, int len )
{
if ( len < 0 ) return 0;
return ( len < 2 ) ||
( str[0] == str[len-1] && testPalindromeRecursive( str + 1, len - 2 ) );
}
int main( void )
{
char s[] = "abbcccbba";
printf( "testPalindromeRecursive( \"%s\" ) is %s\n",
s, testPalindromeRecursive( s, sizeof( s ) - 1 ) ? "true" : "false" );
return 0;
}
程序输出
testPalindromeRecursive( "abbcccbba" ) is true
考虑到您可以遵循公共约定,根据哪个字符串函数不检查传递的字符指针是否等于NULL。程序员有责任在函数调用之前检查它。
答案 3 :(得分:1)
我很想在这里提供Python版本:
def ispalindrome(word):
if len(word) < 2: return True
if word[0] != word[-1]: return False
return ispalindrome(word[1:-1])
>>> ispalindrome('racecar')
True
>>> ispalindrome('racekcar')
False
>>> ispalindrome('a')
True
>>> ispalindrome('aba')
True
答案 4 :(得分:-1)
使用C#
我设法得到了这个:
int testPalindromeRecursive(string str, int len)
{
if (len <= 1)
return 0;
if (str[0] == str[len - 1])
{
str = str.Substring(1, len - 2);
return testPalindromeRecursive(str, str.Length);
}
return -1;
}
ref
与*
的工作几乎完全相同。 =&GT; 删除ref
,因为它不是最佳选择,因为它不允许使用const
答案 5 :(得分:-1)
这对我来说很好用:
#include <stdio.h>
#include <string.h>
int testPalindromeRecursive(char* str, int len)
{
if (len <= 1)
return 1;
if (str[0] != str[len-1])
return 0;
return testPalindromeRecursive(str+1, len-2);
}
int main()
{
int i;
char *strs[5] = { "test", "tvt", "a", "palindrome", "racecar" };
for (i = 0; i < 5; i++)
printf("%s = %d\n", strs[i], testPalindromeRecursive(strs[i], strlen(strs[i])));
}
编辑:根据评论修复以检查长度== 0以及
答案 6 :(得分:-2)
[EDIT2]
这是C中的正确答案。虽然它已被三次下调,但我保留了它,因为这是本页C中唯一正确的答案。
[编辑]
修好了我的回答。
在C:
#include <stdio.h>
#include <string.h>
int testPalindromeRecursive(char* str, int len)
{
if (len <= 1)
return 0;
if (str[0] != str[len-1])
return 1;
return testPalindromeRecursive(str+1, len-2);
}
int main(int argc, char **argv)
{
if (argc < 2)
{
printf("Usage: %s <string>\n", argv[0]);
return 1;
}
if (!testPalindromeRecursive(argv[1], strlen(argv[1])))
printf("Palindrom\n");
else
printf("Not palindrom\n");
return 0;
}
运行kdopen注释中提到的案例示例(testPalindromeRecursive(“a”,1)时基本案例失败:
./palind a
Palindrom
kdopen提到的更多运行示例:
./ mine \“a&lt; - \ the to escape the” 不是palindrom
./ mine \“\” 回文