【遞歸】階乘、全排列 、組合、二分查找

遞歸(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;
}
相關文章
相關標籤/搜索