递归满足2个条件:
1)有反复执行的过程(调用自身)
2)有跳出反复执行过程的条件(递归出口)
f(para......){ if(...)//终止条件 {...//递归的终止项,一般是最低项 } else{//继续递归 ...//譬如for循环,遍历所有可能路径 ...//某些递归逻辑,注意回退事件 }
<pre name="code" class="html">//阶乘 int recursive(int i) { int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum; }
void hanoi(int n,int p1,int p2,int p3) { if(1==n) cout<<"盘子从"<<p1<<"移到"<<p3<<endl; else { hanoi(n-1,p1,p3,p2); cout<<"盘子从"<<p1<<"移到"<<p3<<endl; hanoi(n-1,p2,p1,p3); } }
如1,2,3三个元素的全排列为:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
void Perm(int list[],int k,int m) { if (k == m-1) { for(int i=0;i<m;i++) { printf("%d",list[i]); } printf("n"); } else { for(int i=k;i<m;i++) { Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]); } } }
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
long Fib(int n) { if (n == 0) return 0; if (n == 1) return 1; if (n > 1) return Fib(n-1) + Fib(n-2); }
void Backtrack(int k,int cnt) {//回溯算法主程序 if(k < 0 || cnt == n)//棋牌摆放完毕 or 以摆满n后 { if(cnt == n) { printf("No.%d:\n",++total); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) printf(" %c ",Chess[i][j]); putchar('\n'); } putchar('\n'); } } else { int r = k / n, c = k % n; if(Judge(r,c)) {//可放置一皇后 Chess[r][c] = queen; Backtrack(k-1,cnt+1); Chess[r][c] = blank;//不行的话就要回退重置 } Backtrack(k-1,cnt); } }
(7)最大公约数之辗转相除法
int gcd(int a, int b) { if(!b) return a; else return gcd(b, a%b ); }
int gcd(int a, int b) { int c = a%b; while(c){ a = b; b = c; c = a % b; } return b; }