이 질문을 일반화하기 위해 Zelenski CS 수업 자료를 빌려 왔습니다. 그리고 저는 몇 년 전에 다른 강사로부터 수업을 들었고 C++에 대한이 접근법을 배웠기 때문에 제 특정한 질문과 관련이 있습니다. 유인물은 here입니다. C++에 대한 나의 이해는 가끔씩 사용하기 때문에 낮습니다. 기본적으로 몇 번이나 수업 자료로 돌아가서 비슷한 것을 발견하고 거기서 시작한 프로그램을 작성해야했습니다.공백 유형으로 재귀 backtracking을 반환하는 방법
이 예제 (4 페이지)에서 줄리는 문자열 함수에서 재귀 알고리즘을 사용하여 단어를 찾고 있습니다. 재귀 호출 수를 줄이기 위해 그녀는 결정 점 bool containsWord()
을 추가했습니다.
string FindWord(string soFar, string rest, Lexicon &lex)
{
if (rest.empty()) {
return (lex.containsWord(soFar)? soFar : "");
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
string found = FindWord(soFar + rest[i], remain, lex);
if (!found.empty()) return found;
}
}
return ""; // empty string indicates failure
}
이 알고리즘을 사용하는 방법에 유연성을 추가하려면 void 유형으로 구현할 수 있습니까?
void FindWord(string soFar, string rest, Lexicon &lex, Set::StructT &words)
{
if (rest.empty()) {
if (lex.containsWord(soFar)) //this is a bool
updateSet(soFar, words); //add soFar to referenced Set struct tree
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
return FindWord(soFar + rest[i], remain, lex, words); //<-this is where I am confused conceptually
}
}
return; // indicates failure
}
그리고, 방법에 대한 첫 번째 코드 조각이 soFar
의 초기 값에 추가 rest
의 모든 순열, 시도 할 것이다
void FindWord(string soFar, string rest, Lexicon &lex, Set::StructT &words)
{
if (rest.empty()) {
if (lex.containsWord(soFar))
updateSet(soFar, words); //add soFar to Set memory tree
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
FindWord(soFar + rest[i], remain, lex, words); //<-this is where I am confused conceptually
}
}
}
@Will_Ness 반환하지 않는 버전을 추가했습니다. 이는 내가 마지막으로 사용한 버전에 가깝습니다. 반품 목적을 설명하는 참고서를 설명하거나 가리킬 수 있습니까? –
@ forest.peterson은 동의 할 때 너무 빠르지 않습니다. :) :) 어떤/많은 사람들이 당신의 문제가 완전히 해결되었다고 가정 할 것이고 당신의 질문조차도 보지 않을 것입니다. :) –
@Will_Ness 그들은 CS 클래스에서'return' 문을 설명하는 데 약간의 시간을 할애 할 수있었습니다. 그들은 직관적이라고 생각했습니다. 나는 더 읽고, 이것에 대해 생각하고, 다른 코드 버전을 시도하고, 여기에 더 많은 코멘트를 기다릴 것이다. 'void' 재귀에서'return' 배치는 알고리즘을 조정하는 중요한 도구로 보인다. –