#include<stdio.h>void f(int a[],int n,int k){int i,t;if(n<=k){for(i=0;i<=k;i++)printf("%d",a[i]);printf(" ");}else{for(i=k;i<=n;i++){t=a[k];a[k]=a[i];a[i]=t;f(a,n,k+1);t=a[k];a[k]=a[i];a[i]=t;}}}void main(){int b[]={1,2,3};f(b,2,0);printf("\n");}
你好,
你的代码运行结果如下:
看结果就是排列组合。
如果先不看递归的那行,那么那个for循环造成的结果可以分析为 进行n+1 次交换,第一次为自身交换,后面为首元素和a[i]交换。
再看递归那一行,不断提高k的值,即上面的首元素向后偏移,当首元素为末尾元素的时候就打印数组。
那么只有当n==k+1 的时候才会有结束,此时为 f(a,n,1+1);
那么最后的可以分析为
for ... k = 1, i = 1
a[1],a[1] 交换
打印
a[1],a[1] 交换
.
for ... k = 1, i = 2
a[1],a[2] 交换
打印
a[1],a[2] 交换
.
大致就是这样,然后就是外面套几层for循环、交换数组元素的问题了。
祝你生活愉快。