수동으로 종이에 기록 하시겠습니까? 마지막 자릿수를 확인합니다. 0이면 1로 설정하고, 1이면 다시 0으로 설정하고 다음 숫자로 계속 진행합니다. 그래서 재귀적인 과정입니다.
다음 프로그램 시퀀스 돌연변이의 모든 가능한 조합을 생성
#include <iostream>
template <typename Iter>
bool next(Iter begin, Iter end)
{
if (begin == end) // changed all digits
{ // so we are back to zero
return false; // that was the last number
}
--end;
if ((*end & 1) == 0) // even number is treated as zero
{
++*end; // increase to one
return true; // still more numbers to come
}
else // odd number is treated as one
{
--*end; // decrease to zero
return next(begin, end); // RECURSE!
}
}
int main()
{
char test[] = "0000";
do
{
std::cout << test << std::endl;
} while (next(test + 0, test + 4));
}
프로그램은 어떤 형태의 임의의 시퀀스로 작동한다. 가능한 모든 조합이 동시에 필요하면 인쇄하지 말고 컬렉션에 넣으십시오. 물론 C 배열을 벡터에 넣을 수 없으므로 다른 요소 유형이 필요합니다. 의 문자열의 벡터를 사용하자 :
#include <string>
#include <vector>
int main()
{
std::vector<std::string> combinations;
std::string test = "0000";
do
{
combinations.push_back(test);
} while (next(test.begin(), test.end()));
// now the vector contains all pssible combinations
}
당신이 재귀 마음에 들지 않으면, 여기에 해당하는 반복적 인 솔루션입니다 :
template <typename Iter>
bool next(Iter begin, Iter end)
{
while (begin != end) // we're not done yet
{
--end;
if ((*end & 1) == 0) // even number is treated as zero
{
++*end; // increase to one
return true; // still more numbers to come
}
else // odd number is treated as one
{
--*end; // decrease to zero and loop
}
}
return false; // that was the last number
}
@ Fred "lisp"및 "[C#]"를 추가 할 수있는 리스프 응답과 C# 응답을 알고 있거나 "[언어 관련 없음]"으로 대체해야합니까? –
@Johannes : LISP와 C# 솔루션을보고 싶습니다. :-) Nils가 C++ 채팅에 질문을 게시했기 때문에 C++ 태그를 추가 했으므로 C++ 솔루션에 관심이 있다고 가정했습니다. 하스켈 프로그래머가 하스켈 솔루션을 향상시킬 수 있도록 하스켈 태그를 추가했습니다. – fredoverflow