Generieren Sie rekursiv ein vollständiges Array von n Elementen (C-Sprache).

Vollständige Array-Frage:

Entwerfen Sie einen rekursiven Algorithmus zum Generieren von nnn Elemente{ r 1 , r 2 , ⋯ , rn } \{r_1,r_2,\cdots,r_n\}{ r1,R2,,Rn} vollständige Permutation.

R = { r 1 , r 2 , ⋯ , rn } R=\{r_1,r_2,\cdots,r_n\}R={ r1,R2,,Rn} ist die nn,die angeordnet werden solln个元素,R i = R − { ri } R_i=R-\{r_i\}Rich=R{ rich} .collectionXXDie vollständige Permutation der Elemente in X wird als perm (X) perm(X)bezeichnet.perm ( X ) ,( ri ) perm ( X ) (r_i)perm( X )( rich) pro m ( X ) bedeutet perm ( X ) perm(X) in vollständiger PermutationDie Permutation, die durch Hinzufügen eines Präfixes zu jeder Permutation von per m ( X ) erhalten wird .

Zum Beispiel: R = { 1 , 2 , 3 } R=\{1,2,3\}R={ 1 ,2 ,Die vollständige Permutation von 3 } ist{ 1 , 2 , 3 } \{1,2,3\}{ 1 ,2 ,3 } ,{ 1 , 3 , 2 } \{1,3,2\}{ 1 ,3 ,2 } ,{ 2 , 1 , 3 } \{2,1,3\}{ 2 ,1 ,3 } ,{ 2 , 3 , 1 } \{2,3,1\}{ 2 ,3 ,1 } ,{ 3 , 2 , 1 } \{3,2,1\}{ 3 ,2 ,1 } ,{ 3 , 1 , 2 } \{3,1,2\}{ 3 ,1 ,2 } .

Gemäß der obigen Definition ist R = { 1 , 2 , 3 } R=\{1,2,3\}R={ 1 ,2 ,3 } Um eine vollständige Anordnung durchzuführen, giltR 1 = { 2 , 3 } R_1=\{2,3\}R1={ 2 ,3 } ,R 2 = { 1 , 3 } R_2=\{1,3\}R2={ 1 ,3 } ,R 3 = { 1 , 2 } R_3=\{1,2\}R3={ 1 ,2 } , dannperm ( R ) perm(R)pro m ( R ) durch( r 1 ) perm ( R 1 ) (r_1)perm(R_1 )( r1) pro m ( R _1) ,( r 2 ) perm ( R 2 ) (r_2)perm(R_2)( r2) pro m ( R _2) ,( r 3 ) perm ( R 3 ) (r_3)perm(R_3)( r3) pro m ( R _3) bilden. Zu diesem Zeitpunkt kann perm (R 1) perm(R_1)jeweils mit derselben Methode erhalten werdenpro m ( R _1) ,perm ( R 2 ) perm(R_2)pro m ( R _2) ,perm ( R 3 ) perm(R_3)pro m ( R _3) usw., um in ZukunftDauerwellenpro m , bis jeder angeforderte Satz genau ein Element enthält.

Daher mit nnRR von n ElementenR 's vollständige Permutationperm (R) perm(R)pro m ( R ) kann induktiv definiert werden als :

perm ( R ) = { ( r ) n = 1 ( r 1 ) perm ( R 1 ) , ⋯ , ( rn ) perm ( R n ) n > 1 perm(R)=\begin{cases} (r)&n= 1\\ (r_1)perm(R_1),\cdots, (r_n)perm(R_n)&n>1\\ \end{cases}pro m ( R ) _={ ( r )( r1) pro m ( R _1) ,,( rn) pro m ( R _n)N=1N>1

Implementierungscode:

#include <stdio.h>

void perm(int r[], int head, int rear)
//head是r中所要处理的第一个元素位置,rear是r的末尾元素位置
{
    
    
	int tmp, i;
	if (head == rear)
	//递归终止条件:当集合中只有1个元素时
	{
    
    
		for (i = 0; i <= rear; i++) printf("%d ", r[i]);
		//输出一种排列方式
		printf("\n");
	}
	else
	{
    
    
		for (i = head; i <= rear; i++)
		//从head开始,轮流拿掉一个元素形成新的前缀,并求剩下元素的全排列
		{
    
    
			tmp = r[head]; r[head] = r[i]; r[i] = tmp; 
			//将第i个元素交换到head位置成为前缀,此时前缀储存在a[0,head],剩下元素储存在r[head+1,rear]
			perm(r, head + 1, rear);
			tmp = r[head]; r[head] = r[i]; r[i] = tmp;
			//需要保持原数组不变,求完剩下元素全排列后把第i个元素换回去
		}
		
	}
	
}

int main()
{
    
    
	int a[] = {
    
    1, 2, 3};
	perm(a, 0, 2);
	return 0;
}

Operationsergebnis:
Ergebnisse des vollständigen Array-Laufs

Ich denke du magst

Origin blog.csdn.net/diqiudq/article/details/128585342
Empfohlen
Rangfolge