(一)全排列 算法
全排列:從n個不一樣元素中任取m個元素,按照必定的順序排列起來,當n=m時,全部的排列狀況叫全排列。 函數
f(n)=n! spa
基本算法: code
字典序法,遞增進位制數法、遞減進位制數發、鄰位對換法 遞歸
遞歸Recursion(分治法思想) 字符串
設(ri)perm(X)表示每個全排列前加上前綴ri獲得的排列.當n=1時,perm(R)=(r) 其中r是惟一的元素,這個就是出口條件. it
void Perm(list[],int k,int m) //k表示前綴的位置,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++) { //交換前綴,使之產生下一個前綴.若是list[k]=list[i]則不用交換 Swap(list[k],list[i]); Perm(list,k+1,m); //將前綴換回來,繼續作下一個的前綴排列. Swap(list[k],list[i]); } } } //此處爲引用,交換函數.函數調用多,故定義爲內聯函數. inline void Swap(int &a,int &b) { int temp=a,a=b,b=temp; }
#include <stdio.h> int n = 0; void swap(int *a, int *b) { int m; m = *a; *a = *b; *b = m; } void perm(int list[], int k, int m) { int i; if(k > m) { for(i = 0; i <= m; i++) printf("%d ", list[i]); printf("\n"); n++; } else { for(i = k; i <= m; i++) { swap(&list[k], &list[i]); perm(list, k + 1, m); swap(&list[k], &list[i]); } } } int main() { int list[] = {1, 2, 3, 4, 5}; perm(list, 0, 4); printf("total:%d\n", n); return 0; }
(二)數值的整數次方【劍指offer-11】 io
double PowerWithUnsignedExponent (double base,unsigned int exponent) { if (exponent==0)return 1;//遞歸結束條件 if(exponent==1)return base;//遞歸結束條件 //遞歸部分:遞歸循環量設置 int result = PowerWithUnsignedExponent (base,exponent>>1);//位運算代替除 result*=result; //位運算判斷奇偶 if(exponent&0x1=1)result*=base; return result; }
(三)打印1到最大的n位數【劍指offer-12】 class
提示:n位的整數沒有限定n的取值範圍,須要考慮大數形成存儲溢出問題,字符串是一個簡單有效表示大數的方法。 循環
void PrintMaxNbit(int n) { if (n<=0)return; char* number = new char[n]; number[n] ='/0';//初始化 for(int i=0;i<10;i++) { number[0]= i+'0'; PrintMaxNbitRecursion(number,n,0); } delete []number; } void PrintMaxNbitRecursion(char* number,int length,int index) { if(index==length-1)//遞歸結束條件 { PrintNum(number); return; } for(int i=0;i<10;i++) { number[index]= i+'0'; PrintMaxNbitRecursion(number,length,index+1); } } void PrintNum(char* number) { bool isBeginning = false; int len= strlen(number); for(int i=0;i<len;i++) { if(isBeginning&&number[i]='0')isBeginning=false; if(isBeginning!=0) { cout<<number[i]; } } cout<<endl; }