비 재 귀 와 재 귀 는 전체 배열 을 실현 한다.

6084 단어 c전체 배열
C
재 귀적 사고 가 아 닌 재 귀적 인 문제 풀이 방법 은 시간 이 있 으 면 따로 한 글 을 써 서 서술 하 는데 여기 서 소개 해 야 할 시비 재 귀적 사고 이다.역시 숫자 집합 {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

좋은 웹페이지 즐겨찾기