2017-01-18 10 views
-2

私は単語のPalindromeを見つけたいと思います。何が間違っている?Find Palindrome

主な機能:

int size; 
    string input; 
    cin>>input; 
    size = input.length(); 
    if(testPalindrome(input,size-1,0)) 
    cout<<"It's Palindrome"; 
    else 
    cout<<"It's not Palindrome"; 

そしてtestPalindrome機能は次のとおりです。

bool testPalindrome (string pal , int last, int first){ 

    if (pal[first] != pal[last]) 
     return false; 
    else{ 
     if (first<last) 
      testPalindrome(pal,last-1,first+1); 
     else 
      return true; 
    } 
} 

私はthis linkを読み、回文を決定するための答えを見つけましたが、なぜこの1が動作していませんか?

+4

デバッガを使用して手順を覚える必要があるようですあなたのコードを通して。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

あなたの 'testPalindrome'には、何も返さない。これは*未定義の動作*につながります。良いコンパイラはあなたに警告を叫んでいたはずです。 –

+2

"働かない"より具体的にしてください。プログラムが「うまくいかない」という無数の方法があります。 – molbdnilo

答えて

2

は、私はあなたが機能

if (first<last) 
     return testPalindrome(pal,last-1,first+1); 
     ^^^^^^^ 

通常範囲の最初のパラメータが低い値を指定し、2番目のパラメータは含まれていない範囲の上限値のいずれかを指定するにはreturn文を忘れてしまったと思います文字列自体が変更されず、追加のメモリ割り当てをエスケープするため、最初のパラメータは定数参照型を持つと宣言する必要があります。

再帰関数は

#include <iostream> 
#include <string> 

bool testPalindrome(const std::string &s, 
    std::string::size_type i, 
    std::string::size_type n) 
{ 
    return n < 2 || (s[i] == s[n-1] && testPalindrome(s, i + 1, n - 2)); 
} 

int main() 
{ 
    std::cout << testPalindrome("abba", 0, 4) << std::endl; 
    std::cout << testPalindrome("aba", 0, 3) << std::endl; 
    std::cout << testPalindrome("aa", 0, 2) << std::endl; 
    std::cout << testPalindrome("a", 0, 1) << std::endl; 
    std::cout << testPalindrome("ab", 0, 2) << std::endl; 

    return 0; 
} 

のように書くことができるプログラムの出力は、タイプstd::stringの目的は、パリンドロームであるかどうかをチェックする最も簡単な方法は、式を記述することである

1 
1 
1 
1 
0 

ある

s == std::string(s.rbegin(), s.rend()) 
6

他の関数を呼び出すときと同じように、再帰呼び出しの結果を返す必要があります。

そうでない場合、動作は未定義です。