回文检查的递归方法

时间:2015-05-11 13:27:28

标签: c algorithm recursion palindrome

是否可以使用以下参数列表定义回文检查的递归方法?

int testPalindromeRecursive(char* str, int len) { ... }

注意:不必使用外部子函数或全局变量

我认为这是不可能的,因为你必须以某种方式记住最后一个(前面)索引位置。

7 个答案:

答案 0 :(得分:8)

是的,完全有可能 - 正如几个人所提到的那样。

基础案例:

  • 如果len< = 1,则返回True
  • 如果str [0]!= str [len-1]返回False

另外:用(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 \“\” 回文