2013-11-21 3 views
0

를 사용하여 다른 문자열을 찾을 수 :검색 문자열이 나는 다음과 같은 간단한 프로그램에서 일하고 있어요 재귀

/** 
    Recursively searches a string to find a second string. 
    @param s the string to search through. 
    @param t the string to search for 
    @return true if t is found in s. 

    Tests whether the string t is contained in a string s. 
    For instance, calling the function like this: 
     bool b = find("Mississippi", "sip"); 
    returns true, since "sip" is contained in "Mississippi". 
    You must write this as a recursive function, not by just 
    calling the string::find() function, or by using a loop. 

*/ 

bool find(const string& s, const string& t) 

{ 
    string temp = s;  
    if(temp.size() < t.size())  
     return false; 
    temp.erase(0, 1);  
    find(temp, t);  
} 

가 여기 내 테스트 출력입니다 : 나는 그것에 대해 4 다른 방법을 서면으로 작성했습니다

Checking function: Checking the find recursive function. ------------- 

    + find("Mississipi", "ipi") 
    X find("Mississipi", "ipx") should be false, but is true. 
    + find("Sommertown", "Som") 
    + find("Sommertown", "Sommertowne") 
    + find("Somewhere in the middle", "in") 

---------------------------------------------------------------------- 
    Tests passing 4/5 (80%). 

, 모두 비슷한 ... temp.erase 대신 find (temp.substr (1), t)를 포함하는 것을 포함합니다.

아무도 올바른 방향으로 나를 가리키지 않을까요? 나는 그것이 단순한 실수라는 것을 알고 있지만 나는 그것을 보지 않고있다!

감사합니다.

+3

분명히, 당신의 함수에 오직 하나의 리턴이 있기 때문에 그것은 단지'false'를 리턴 할 것입니다 ... – Johan

+1

당신의 의견은 당신의 프로그램보다 길다. 간단하게 유지 :) – keyser

+1

'find'의 모든 경로가 값을 반환하는 것은 아닙니다. 또한 '찾기'는 실제로 '임시'또는 's'와 't'를 비교하지 않으며 그 반대도 마찬가지이므로 's'에서 실제로 't'를 찾지 않습니다. –

답변

0

솔루션 두 가지 문제점이 있습니다 find

  1. 모든 제어 경로를 명시 적으로 find 실제로 t 확인되지 않은,
  2. t 어떤 식 으로든 s 비교되지 않습니다 값을 반환은 - 한 번에 한 문자 씩 지워집니다.

이 같은 수 있습니다 함수를 작성하는 더 좋은 방법이 함수에서 가능한 모든 제어 경로가 값을 반환하고 t 항상 s 비교됩니다

bool find(const string& s, const string& t) 
{ 
    string temp = s; 

    // Boundary condition which should return true 
    if (temp.substr(0, t.size()) == t) 
     return true; 

    // Boundary condition which should return false 
    if (temp.size() < t.size()) 
     return false; 

    return find(temp.substr(1), t); // Recursive call 
} 

^^ 참고 .

또한 귀하의 솔루션에서 모든 제어 경로가 이 아니며 명시 적으로이 값을 반환한다고 명시했습니다. C++ 함수는 반환 문이 없어도 값을 반환하지만 @Johan이 지적한대로 마지막 평가 대상은 이 아니고이 true입니다. 예를 들어, 귀하의 솔루션을 코딩하고 find에서 "224"라는 응답을 받았지만 find이 true를 반환하면 "1"응답을 받았을 것입니다.

+0

이것은 내 버전 중 하나가 어떤 모습인지 거의 단어이지만 내 검사 테스트입니다 – jlee

+0

테스트 H37, loginID ----------------------- ----------------------------------------------- 확인 중 함수 : 찾기 재귀 함수를 확인하십시오. ------------------- + find ("Mississipi", "ipi") + find ("Mississipi", "ipx") X find ("Sommertown ","Som ")은 사실이어야하지만 거짓입니다. + find ("Sommertown", "Sommertowne") X 찾기 ("중간 어딘가에", "in")는 참이어야하지만 거짓입니다. ------------------------------------------------ ---------------------- 시험 합격 3/5 (60 %). 계속하려면 아무 키나 누르십시오. . . – jlee

+0

나는 내 대답을 약간 편집했다. 반드시's'와't'가 서로 같아야 할 필요는 없습니다. 단지's'의 첫 번째't.size()'문자 일뿐입니다. –

0

함수는 항상 false를 반환합니다. 그것은 s.size() < t.size()까지 문자열 s의 한 문자를 제거합니다.

나는 기능을 다음과 같은 방법을 작성합니다 :)

bool find(const std::string &s, const std::string &t) 
{ 
    return (s.size() < t.size() ? 
      false : 
      (s.compare(0, t.size(), t) == 0 ? 
       true : 
       find(std::string(s, 1), t))); 
} 
+0

구현을 해고하는 대신 OP의 코드와 정확히 무슨 문제가 있었는지 설명하십시오. OP를 배우십시오. – arne

+0

제발! 내 실수를 이해하고 싶다. – jlee

0

내가 사람을 그것을 알아 냈 :.

bool find(const string& s, const string& t) 
{ 
    if(s.length() < t.length()) 
     return false; 
    else if(s.substr(0, t.size()) == t) 
     return true; 

    return find(s.substr(1),t); 
} 

TESTING H37, loginID 
---------------------------------------------------------------------- 
Checking function: Checking the find recursive function. ------------------- 
    + find("Mississipi", "ipi") 
    + find("Mississipi", "ipx") 
    + find("Sommertown", "Som") 
    + find("Sommertown", "Sommertowne") 
    + find("Somewhere in the middle", "in") 
---------------------------------------------------------------------- 
    Tests passing 5/5 (100%). 

Press any key to continue . . . 

나는 당신의 도움을 주셔서 감사합니다! 이 사이트는 새로운 프로그래머를위한 선물입니다!

관련 문제