递归
一、1、求阶乘
int Factorial(int n){
if(n==0) return 1;
return n*Factorial(n-1);
}
2、
Fibonacci函数
int Fibonacci(int n){
if(n==1) return 1;
if(n==2) return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
3、全排列:
(1)、字符串的全排列
主函数见(2).
int Permutation(char a[],int k,int m){
if(k==m){
for(int i=0;i<=m;i++){
cout<<a[i];
}
cout<<endl;
}else{
for(int i=k;i<=m;i++){
swap(a[k],a[i]);
Permutation(a,k+1,m);
swap(a[i],a[k]);
}
}
}
(2)、数式的全排列
#include<iostream>
#include<vector>
#include<malloc.h>
#include<algorithm>
using namespace std;
int Permutation(int a[],int k,int m){
if(k==m){
int d,b,c;
d=a[0]*100+a[1]*10+a[2];
b=a[3]*100+a[4]*10+a[5];
c=a[6]*100+a[7]*10+a[8];
if(d+b==c){
cout<<d<<"+"<<b<<"="<<c<<endl;
}
}else{
for(int i=k;i<=m;i++){
swap(a[k],a[i]);
Permutation(a,k+1,m);
swap(a[i],a[k]);
}
}
}
int main(){
int n;
while(cin>>n){
int *arr=new int [n];
for(int i=0;i<n;i++){
cin>>arr[i];
}
Permutation(arr,0,n-1);
}
return 0;
}
4、整数划分问题
//n为加数,m为加数约束条件(n<=m);q(n,m)即为将最大加数n1不大于m的划分个数。
int q(int n,int m){
if((n<1)||(m<1)) return 0;
if((n==1)||(m==1)) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
5、Hanoi塔问题
void move(int n,char A,char B){
cout<<++step<<" : move "<<n<<" from "<<A<<" to "<<B<<endl;
}
void Hanoi(int n,char A,char B,char C){
if(n>0){
Hanoi(n-1,A,C,B);
move(n,A,C);
Hanoi(n-1,B,A,C);
}
}
补充:(动态一维数组的开辟)
#include<iostream>
#include<vector>
#include<malloc.h>
using namespace std;
int main(){
int n;
int *arr=0;
while(cin>>n){
int a[n];
int *b=new int [n];
//arr=(int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
//cin>>arr[i];
cin>>a[i];
}
for(int i=0;i<n;i++){
//cin>>arr[i];
cout<<a[i]<<" ";
}
}
return 0;
}
分治
二、1、二分查找法
(1)、非递归算法 ``` int BinarySearch(int a[],int key,int low,int high){
while(low<=high){
int mid=(low+high)/2;
if(a[mid]==key) return mid;
else if(a[mid]<key) low=mid+1;
else high=mid-1;
}
return -1;
}
(2)、递归算法
//递归算法
int BinarySearch(int a[],int key,int low,int high){
if(low>high) return -1;
int mid=(low+high)/2;
if(key==a[mid]) return mid;
else if(key<a[mid]) return BinarySearch(a,key,low,mid-1);
else return BinarySearch(a,key,mid+1,high);
}
//主函数
int main(){
int n;
while(cin>>n){
int * a=new int [n];
for(int i=0;i<n;i++){
cin>>a[i];
}
int key=0;
cin>>key;
int result=BinarySearch(a,key,0,n-1);
cout<<result<<endl;
}
return 0;
}
2、归并排序
#include<iostream>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
using namespace std;
const int maxn=100;
void Merge(int SR[],int s,int m,int t){
int i=s,j=m+1,k=s;
int temp[maxn];
int index=0;
while(i<=m&&j<=t){
if(SR[i]<SR[j]) temp[index++]=SR[i++];
else temp[index++]=SR[j++];
}
while(i<=m) temp[index++]=SR[i++];
while(j<=t) temp[index++]=SR[j++];
for(int i=0;i<index;i++){
SR[s+i]=temp[i];
}
}
void MergeSort(int SR[],int s,int t){
if(s<t){
int mid=(s+t)/2;
MergeSort(SR,s,mid);
MergeSort(SR,mid+1,t);
// int * TR=new int [1000];
Merge(SR,s,mid,t);
// memcpy(SR,TR,(t-s)+1);
// for(int i=0;i<t;i++){
// cout<<TR[i]<<" ";
// }
// cout<<endl;
}
}
int main(){
int n;
while(cin>>n){
int * a=new int [n];
for(int i=0;i<n;i++){
cin>>a[i];
}
MergeSort(a,0,n-1);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
3、快速排序
(1)、非随机化快排
#include<iostream>
using namespace std;
int partition(int A[],int left,int right){
int temp=A[left];
while(left<right){
while(left<right&&temp<A[right]) right--;
A[left]=A[right];
while(left<right&&temp>=A[left]) left++;
A[right]=A[left];
}
A[left]=temp;
return left;
}
void QuickSort(int A[],int left,int right){
if(left<right){
int pos=partition(A,left,right);
QuickSort(A,left,pos);
QuickSort(A,pos+1,right);
}
}
int main(){
int n;
while(cin>>n){
int * a=new int [n];
for(int i=0;i<n;i++){
cin>>a[i];
}
QuickSort(a,0,n-1);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
(2)、随机化快排
根据上一个的主函数改写Partition函数即可,在每一次的开始随机的选取一个元素作为主元,这样的优点时在对已有顺序的序列排序时候的效率会很高
//随机化快排注意添加头文件<stdlib.h>
int randPartition(int A[],int left,int right){
//int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
int p=rand()%(right-left+1)+left;
swap(A[p],A[left]);
int temp=A[left];
while(left<right){
while(left<right&&temp<A[right]) right--;
A[left]=A[right];
while(left<right&&temp>=A[left]) left++;
A[right]=A[left];
}
A[left]=temp;
return left;
}