2017-01-18 4 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을 읽고 회문을 결정하기위한 해답을 찾았지만, 왜 하나가 작동하지 않습니다나요?

+4

디버거를 사용하여 t 단계를 수행하는 방법을 배워야 할 수도 있습니다. 코드를 살펴보십시오. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : ** [작은 프로그램 디버깅 방법] (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); 
     ^^^^^^^ 

보통 범위의 첫 번째 매개 변수는 낮은 값을 지정하고 두 번째 매개 변수에 포함되지 않는 범위의 상한 값 중 하나를 지정에서 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

다른 함수를 호출 할 때와 마찬가지로 재귀 호출의 결과를 반환해야합니다.

그렇지 않으면 동작이 정의되지 않습니다.