1. 汉诺塔问题递归算法分为 3 步将 n 个 a 上的盘子借助 c 移动到 b① 将 n-1 个 a 上的盘子借助 b 移动到 c② 将 a 上的盘子移动到 b③ 将 c 上的 n-1 个盘子借助 a 移动到 b所有盘子都移动到 b 上了1234567891011voidhanoi(intn,chara,charb,charc)//将n个碟子从a借助c 移到b{if(n0)return;else{hanoi(n-1,a,c,b);move(a,b);hanoi(n-1,c,b,a);2. 全排列问题问题描述设R{r1,r2,…,rn}是要进行排列的n个元素求R的全排列Perm(R)。算法思路① 从 n 个数中取出数列的第一个数然后不断将数列中剩余的数与第一个数进行交换计算剩余 n-1 个数的全排列。② 对 n - 1 个数进行同样的递归操作当交换的第一个数的下标 k 和 序列末尾的 m 相同时说明前置所有数都已经交换完成进行输出。③ 递归结束后进行状态回调保证不影响下一次递归的进行。123456789101112131415161718voidPerm(intlist[],intk,intm){if(km){for(inti0;im;i{coutlist[i];}coutendl;return;}for(intik;im;i){swap(list[k], list[i])Perm(list, k1, m)swap(list[k], list[i])}}3. 利用递归与分治策略寻找最大值12345678910111213141516171819#include bits/stdc.husingnamespacestd;intfind_max(inta[],intfrom,intto){if(fromto)returna[from];intmid (from to)/2;intv1 find_max(a, from, mid);intv2 find_max(a, mid1, to);if(v1v2)returnv2;elsereturnv1;}intmain(){intn, a[100000];cinn;for(inti0;in;i){cina[i];}coutfind_max(a, 0, n-1);}4. 归并排序123456789101112131415161718192021222324252627282930313233343536#include bits/stdc.husingnamespacestd;voidmerge_array(inta[],intfrom,intmid,intto){inttmp[100000], idx_tmp0;inti,j;for(ifrom, jmid1; imid jto;){if(a[i]a[j]) tmp[idx_tmp] a[i];elsetmp[idx_tmp] a[j];}while(imid) tmp[idx_tmp]a[i];while(jto) tmp[idx_tmp]a[j];for(intifrom,j0; ito;i) a[i] tmp[j];}voidmerge_sort(inta[],intfrom,intto){if(from to){intmid (from to)/2;merge_sort(a, from, mid);merge_sort(a, mid1, to);merge_array(a, from, mid, to);}}intmain(){intn, a[100000];cinn;for(inti0;in;i){cina[i];}merge_sort(a, 0, n-1);for(inti0;in;i){printf(%d , a[i]);}}5. 快速排序图解快速排序//www.jb51.net/article/113769.htm递归 交换法1234567891011121314151617181920212223242526272829303132333435363738394041#include bits/stdc.husingnamespacestd;intsort_array(inta[],intfrom,intto){intbase a[from];inti,j;for(ifrom, jto; ij;){while(a[j]base ij) j--;while(a[i]base ij) i;//function swap()if(ij){intta[i];a[i]a[j];a[j]t;}}a[from]a[i];a[i]base;returni;}voidquick_sort(inta[],intfrom,intto){if(fromto)return;inti sort_array(a, from, to);quick_sort(a, from, i-1);quick_sort(a, i1, to);}intmain(){intn, a[100000];cinn;for(inti0;in;i){cina[i];}quick_sort(a, 0, n-1);for(inti0;in;i){printf(%d , a[i]);}}6. 棋盘覆盖问题1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include bits/stdc.husingnamespacestd;intnum0;inta[1000][1000];voidmake_chess(intpx,intpy,inttx,intty,intsze){if(sze1)return;num;sze/2;//左上if(pxtxsze pytysze){a[txsze-1][tysze]num;a[txsze][tysze-1]num;a[txsze][tysze]num;}//右上if(pxtxsze pytysze){a[txsze-1][tysze-1]num;a[txsze][tysze-1]num;a[txsze][tysze]num;}//左下if(pxtxsze pytysze){a[txsze-1][tysze-1]num;a[txsze-1][tysze]num;a[txsze][tysze]num;}//右下if(pxtxsze pytysze){a[txsze-1][tysze-1]num;a[txsze-1][tysze]num;a[txsze][tysze-1]num;}//左上if(pxtxsze pytysze) make_chess(px, py, tx, ty, sze);elsemake_chess(txsze-1, tysze-1, tx, ty, sze);//右上if(pxtxsze pytysze) make_chess(px, py, tx, tysze,sze);elsemake_chess(txsze-1, tysze, tx, tysze,sze);//左下if(pxtxsze pytysze) make_chess(px, py, txsze, ty,sze);elsemake_chess(txsze, tysze-1, txsze, ty, sze);//右下if(pxtxsze pytysze) make_chess(px, py, txsze, tysze, sze);elsemake_chess(txsze, tysze, txsze, tysze, sze);}intmain(){intk, px, py;inttx0, ty0;cinkpxpy;make_chess(px-1, py-1, tx, ty, k);for(inti0; ik; i){for(intj0; jk; j){printf(%2d , a[i][j]);}coutendl;}}以上就是C递归与分治算法原理示例详解的详细内容