遞歸(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; }