template<class _BidIt> inline
bool _Next_permutation(_BidIt _First, _BidIt _Last)
{
       _BidIt _Next = _Last;
       if (_First == _Last || _First == --_Next)
              return (false);

       for ( ; ; )
       {
              _BidIt _Next1 = _Next;
              if (_DEBUG_LT(*--_Next, *_Next1))
              { 
                     _BidIt _Mid = _Last;
                     for (; !_DEBUG_LT(*_Next, *--_Mid); )
                            ;
                     _STD iter_swap(_Next, _Mid);
                     _STD reverse(_Next1, _Last);
                     return (true);
              }

              if (_Next == _First)
              {
                     _STD reverse(_First, _Last);
                     return (false);
              }
       }
}

 

 

이건 간단 명료해서 이해하기 쉬울 거임. 보다시피 재귀를 쓰지 않고 있다.

다른 함수 이름은 명확하게 있으니 뭐 알고리즘은 쉽게 이해하겠지.

(사실 재귀 쓸 이유도 없는게 니가 하려는 건 전체 순열 경우를 구하는 거고

이건 다음 순열을 구하는 거니까 문제가 애초에 다르지.

말하자면 니가 하는건 next_permutation 을 n! 번 루프 돌리는 거)