-4

问题是

回文是一个在两个方向上读取相同的字符串,例如,racecar、eye 等。编写一个程序,提示用户输入一个字符串并使用递归函数来确定给定的输入是否是回文

到目前为止我已经这样做了,但它不起作用:

#include<stdio.h>
#include<conio.h>
#include<string.h>// to save string

int isPalindrome(char*str);

int main (void)
{
    int result;
    char str[50];

    printf("\n pls enter string; \n");
    gets(str);
    result = isPalindrome(str);

    if(result ==1) 
    {
        printf("\n input string in a palindrome string ");
    }
    else
    {
        printf(" not a palindrome");
    }

    getch();

    return 1;
}

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

   if(str[0]=str[lenght - 1])
   {
       length-=2;
   }

   return isPalindrome(str + 1)
}


{
     return 0;
}
4

5 回答 5

7

由于您将问题标记为 C++,因此这种方法可行:

#include <string>
#include <algorithm>
#include <iostream>

bool isPalindrome(const std::string& str)
{
    // comparison based on 2 string iterators - a "normal" one
    // and a reversed one
    return std::equal(str.rbegin(), str.rend(), str.begin());
}

int main()
{
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}
于 2012-11-30T14:51:21.557 回答
3

鉴于 Stephan 的回答中的测试功能是如此之小,我们可以使用 lambda 语法进一步简化它......

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    auto isPalindrome = [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());};
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}

这将允许你做一些像这样的整洁的东西

#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string> v{"cat", "racecar", "truck", "1991", "eye", "fish"};

    std::cout << "There are " <<
    count_if(v.begin(), v.end(), [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());})
    << " palindromes in the list";
}
于 2012-11-30T15:17:11.110 回答
2

几乎有关此功能的所有内容都被破坏了:

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]=str[lenght - 1])
    {
        length-=2;
    }

    return isPalindrome(str + 1)
}

{
     return 0;
}

我假设你刚刚做了一个非常粗心的复制和粘贴。基本上,return 0不是函数范围的一部分,因此您的测试永远不会返回 0。因此它将接受所有字符串作为回文。这甚至在您的第一个和最后一个字符测试也被打错和不正确的事实之前。

修复最明显的错误:

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]==str[length - 1])
    {
        length-=2;

        return isPalindrome(str + 1)
    }

    return 0;
}

导致一些代码至少会构建、运行并给出正确的结果。但它不是 C++!

于 2012-11-30T14:43:13.300 回答
0

这条线有问题:

if(str[0]=str[lenght - 1])

首先,变量是length不是 lenght
仅此一项就表明您发布的代码不是您实际运行的代码。

其次,在 C 中,相等比较是==,而不是单等号(用于赋值)。

于 2012-11-30T14:36:19.353 回答
0

您在标签中说 C++,所以..

#include <iostream>
#include <algorithm>
#include <string>

int main ()
{
    std::string input, tupni;
    std::cout << "Enter string: ";
    std::getline(std::cin, input);

    tupni = input;
    std::reverse(tupni.begin(), tupni.end());

    if(tupni==input){
        std::cout << "Is a palindrome" <<std::endl;
    }else{
        std::cout << "Not a palindrome" <<std::endl;
    }
}

这使用了reverse来自 STL 的算法。始终查看可用的现有算法。几乎总会有一些东西可以帮助您快速解决问题。

这里的字符串副本有点浪费。为了提高效率,请使用 Stephan 建议的反向迭代器方法。

于 2012-11-30T14:44:52.477 回答