ZKX's LAB

全排列 递归算法 NOIP题目 递归算法的全排列

2020-07-24知识13

全排列递归算法 希望我的答复可以帮助你加深理解:第一,perm函数中的条件for(int i=k;i;i+)应更正为 for(int i=k;i;i+)第二,你可以在核心步骤的前后打印有关变量的值,分析查看每一步的具体执行情况,这是编程调试的重要能力,要加强。第三,以下是我提供的附件程序及运行结果(以1,2,3这个数组的全排列),可辅助分析:1.程序源码=includeincludeint N,P=0;void swap(int a[],int i,int j){int temp=a[i];a[i]=a[j];a[j]=temp;}void perm(int a[],int k,int m,int pk,int pm){int i;k为中间变量,m初始化为参与排列元素的起始坐标和终止坐标pk,pm分别表示参与排列元素的起始坐标和终止坐标,整个递归过程保持不变*/if(k=m){printf(\"->;perm%d:\\n\",P/N+1);打印提示*/for(i=pk;i;i+){printf(\"%d\",a[i]);P=P+1;}printf(\"\\n\\n\");}else{for(i=k;i;i+){printf(\"a%d,%d,%d,%d,%d\\n\",i,k,a[0],a[1],a[2]);swap(a,k,i);printf(\"b%d,%d,%d,%d,%d\\n\",i,k,a[0],a[1],a[2]);perm(a,k+1,m,pk,pm);printf(\"c%d,%d,%d,%d,%d\\n\",i,k,a[0],a[1],a[2]);swap(a,k,i);printf(\"d%d,%d,%d,%d,%d\\n\",i,k,a[0],a[1],a[2]);}}}int main(){调节以下N值及对应数组内容,可打印。哪位高手能帮我参透全排列的递归算法,跪谢~~ 知道汉诺塔的递归程序的意思吗就是先控制一个不动,让剩余的排列好,然后再移动第一个,再排列好剩余的这个程序也是这个意思举个例子说 12341。先保持1不动,排列2342。保持2不动,排列343。保持3不动,排列44。得到4;输出1234。5。然后跳转到3,将3与4互换,6。得到3;输出1243。7。跳转到2,将2与3互换,8。重复3-6,得1324,1342。9。跳转到2,将2与4互换,得到1423,1432。以下省略若干步。最后就得到全排列解答完毕一个比较好的全排列算法(C语言)-|killniu 发表于 2006-4-18 23:39:00我有一个比较好的全排列算法,我验证了3、4、5的结果是正确的。程序中没有使用递归,只是几个循环,速度还令人满意。在C466A,Win2000的机器上,进行8个数字的全排列,结果不显示,重定向到一个文本文件中,耗时不到一秒钟9个数字的全排列耗时6秒种。10个数字的全排列55秒种。(以上都不显示结果,均重定向到一个文本文件)11个数字的全排列(不显示结果,在原程序中不定义ISPRINT)耗时大约16秒钟。欢迎各位指点算法为:用两个数组,一个数组存放当前结果,第二个数组是每一个数是否已经使用的标志。比如对10个数进行全排列,第一个结果是:0 1 2 3 4 5 6 7 8 9。然后。全排列的递归算法是怎样的? using System;namespace TotalSort {/*/全排列的递归算法/class Class1 {/*/应用程序的主入口点。[STAThread]static void Main(string[]args){/char[]s=。

#递归算法#递归调用#递归#c语言

随机阅读

qrcode
访问手机版