비 재 귀 와 재 귀 는 전체 배열 을 실현 한다.
재 귀적 사고 가 아 닌 재 귀적 인 문제 풀이 방법 은 시간 이 있 으 면 따로 한 글 을 써 서 서술 하 는데 여기 서 소개 해 야 할 시비 재 귀적 사고 이다.역시 숫자 집합 {1, 2, 3} 을 예 로 들 면.이 집합 이 생 성 된 질서 있 는 서열 집합 중의 첫 번 째 서열 은 123 으로 쉽게 알 수 있다.문 제 는 어떻게 이 서열 에 따라 다음 질서 있 는 서열 을 생 성 합 니까?다음 질서 있 는 서열 은 사전 서열 에서 이전 서열 보다 딱 크 고 132 여야 한다. 첫 번 째 서열 중의 2 와 3 을 교환 하 는 위 치 를 알 수 있다.1, 3, 2 다음 서열 은 2, 13 으로, 마지막 2 를 1 앞 에 놓 았 다.2, 13 에 이 어 2, 3, 1 은 2, 13 에 이 어 마지막 3 을 1 로 앞 섰 다.직관 적 인 느낌 은 뒤에서 앞으로 찾 아 적당 한 수 를 만 났 을 때 앞의 어떤 숫자 와 교환 하 는 것 이다.구체 적 인 알고리즘 설명 은 디지털 집합 {1, 2, 3} 을 예 로 들 면: 1, 첫 번 째 서열 은 현재 집합 요소 가 연 결 된 그 자체 이다.2. 뒤에서 앞으로 찾 으 면 뒤의 수 는 앞의 수 대 (작은 것 에서 큰 것 으로 역순 대 라 고 함) 보다 많 고 모든 배열 이 생 성 되 었 음 을 설명 하지 못 한다 (즉, 123 에서 321). 찾 으 면 (예 를 들 어 213 중의 1 과 3 은 역순 대) 멈 춘 다.3. 213 을 예 로 들 면 3 의 위 치 를 i 로 기억 하고 뒤에서 앞으로 숫자 를 찾 는 것 이다. 딱 1 (위 치 는 i - 1) 이상 의 수 를 찾 으 려 면 여기 가 3 임 이 분명 하 다.4. 세 번 째 단계 에서 찾 은 수 와 위 치 를 i - 1 로 교환 합 니 다.5. 역 치 는 위치 i 에서 시작 하여 집합 끝 에 이 르 는 모든 수 를 설정 합 니 다. 예 를 들 어 * * * 321 (위치 i 는 3) 에서 * * * 123 (위치 i 는 1) 까지 입 니 다.6. 역순 대 를 찾 지 못 할 때 까지 이 과정 을 반복 하면 모든 서열 이 생 성 된다.
#include <stdio.h>
void swap(int *p,int*q)
{
int tmp;
tmp=*p;
*p=*q;
*q=tmp;
}
void mknewseq(int *data,int start, int last)
{
while(start<last)
{
swap(&data[start],&data[last]);
start++;
last--;
}
}
void showdata(int *data,int num)
{
int i=0;
for(i=0;i<num;i++)
{
printf(" %d ",data[i]);
}
printf("
");
}
int findall(int *data,int num)
{
int i,j;
int lastdata=num-1;
int tmp;
for(i=lastdata;i>0;i--)
{
if(data[i]>data[i-1]) break;
}
if(0==i) return 0;
tmp=i;
for(j=lastdata;j>=i;j--)
{
if((data[j]>data[i-1])&&(data[j]<data[tmp]))
tmp=j;
}
swap(&data[tmp],&data[i-1]);
mknewseq(data,i,lastdata);
return 1;
}
int main()
{
int data[4]={1,2,3,4};
showdata(data,4);
while(findall(data,4)){
showdata(data,4);
}
return 0;
}
운행 결과:1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
귀착 하 다
#include <stdio.h>
void perm(int* data, int n, int curr)
{
if (curr==n-1)
{
for (int i = 0; i < n; ++i)
printf("%d", data[i]);
printf("
");
}
else
{
for (int i = curr; i < n; ++i)
{
int t;
t = data[curr], data[curr] = data[i], data[i] = t;
perm(data, n, curr+1);
t = data[curr], data[curr] = data[i], data[i] = t;
}
}
}
int main()
{
int array[] = {1,2,3};
perm(array, sizeof(array)/sizeof(array[0]), 0);
return 0;
}
123
132
213
231
321
312
Press any key to continue
public class AllPermutation
{
public static void main(String[] args)
{
//
char[] source=new char[]{'A','B','C'};
char[] result=new char[source.length];
allPermutation(0,source,result);
}
/**
*
* @param index ( 0 )
* @param source
* @param result
*/
public static void allPermutation(int index,char[] source,char[] result){
// , ,
if(source.length==1){
result[index]=source[0];
show(result);
return ;
}
for(int i=0;i<result.length-index;i++){
result[index]=source[i];
char[] newSource=getNewSource(source,source[i]);
allPermutation(index+1, newSource,result);
}
}
public static void show(char[] result){
System.out.println(result);
}
/**
*
* @param source
* @param c
* @return
*/
public static char[] getNewSource(char[] source,char c){
char[] newSource=new char[source.length-1];
for(int i=0,j=0;i<source.length;i++){
if(source[i]!=c){
newSource[j]=source[i];
j++;
}
}
return newSource;
}
}
Java
package com.syj.csdn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* <p>
* Title:
* </p>
*
* <p>
* Copyright: http://blog.csdn.net/sunyujia/
* </p>
*
* @author
* @main [email protected]
* @date 2009-04-25 23:57:23 PM
*/
public class FullSort {
// NUM
private static int NUM = 3;
/**
* : ,
*
* @param datas
* @param target
*/
private static void sort(List datas, List target) {
if (target.size() == NUM) {
for (Object obj : target)
System.out.print(obj);
System.out.println();
return;
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sort(newDatas, newTarget);
}
}
public static void main(String[] args) {
String[] datas = new String[] { "a", "b", "c", "d" };
sort(Arrays.asList(datas), new ArrayList());
}
}
python
def permutations(iterable, r=None):
# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
# permutations(range(3)) --> 012 021 102 120 201 210
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
return
indices = range(n)
cycles = range(n, n-r, -1)
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
참고: [1]. http://blog.csdn.net/syzcch/article/details/8136218 [2]. http://bbs.csdn.net/topics/220058319 [3]. http://blog.csdn.net/sunyujia/article/details/4124011 [4]. http://docs.python.org/2/library/itertools.html#itertools.permutations
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.