递归(recursion):程序调用自身的编程技巧。ios
递归知足2个条件:编程
1)有反复执行的过程(调用自身)数组
2)有跳出反复执行过程的条件(递归出口)spa
最简单的例子是阶乘code
#include <iostream> using namespace std; //阶乘n! = n * (n-1) * (n-2) * ...* 1(n>0) int recursive(int i) { int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum; } int main(){ int a=4; int result=recursive(a); cout<<a<<"的阶乘为"<<result<<endl; }
全排列递归
从n个不一样元素中任取m(m≤n)个元素,按照必定的顺序排列起来,叫作从n个不一样元素中取出m个元素的一个排列。当m=n时全部的排列状况叫全排列。字符串
#include <stream> using namespace std; //全排列 inline void Swap(int &a,int &b) { int temp=a; a=b; b=temp; } 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]); } } } int main() { int list[]={4,6,7}; int len=3; for(i=0;i<len;i++){ Perm(list,i,len); } }
组合it
输入字符串,输出字符串全部组合io
#include <iostream> #include <vector> using namespace std; void sets(char *data,int start,int end,int m, vector<char> &v) { if( m <=0 || start>end ||end-start+1<m) { if(m ==0) { for(vector<char>::iterator it = v.begin();it<v.end();it++) { cout << *it; } cout << endl; } return; } else { v.push_back(data[start]); sets(data,start+1,end,m-1,v); v.pop_back(); sets(data,start+1,end,m,v); } } int main(){ char data[] = "abcd"; vector<char> v; int len = strlen(data); for(int i = 1 ; i <= len ; ++i) { sets(data,0,len-1,i,v); } return 1; }
二分查找递归class
在顺序数组中二分查找元素
#include <iostream> using namespace std; int findBi(int list[],int start,int end,int key){ if(end < start) return -1; else{ int mid=(start+end)/2; if(list[mid] == key){ return mid; }else if(list[mid] > key){ return findBi(list,start,mid-1,key); }else{ return findBi(list,mid+1,end,key); } } } int main(){ int list[]={2,5,6,7,11,12}; int key=4; int location=findBi(list,0,5,key); cout<<"findbi "<<key<<"in list:"<<location<<"."<<endl; }