遞迴函式匯總(二)

來源:互聯網
上載者:User

2.求集合的冥集
   代碼:
void GetPowerSet1(int i,char a[],char b[],int n)
{
    //功能:求以數組a中元素為集合中元素的集合的冥集
    int j;
    if(i==n-1)
   {
    b[n]='/0';
    for(j=0;j<n+1;j++)
    if(b[j]!=' ') cout<<b[j];     //對空格不輸出
     cout<<endl;
   }
    else
    {
        b[i]=a[i]; GetPowerSet(i+1,a,b,n);
       b[i]=' ';   GetPowerSet(i+1,a,b,n);
    }
}
後記:適當改造可以用來求一個字串的所有子串.

3.將任意整數N,分解成多個互不相同的正整數的和,列印所
有可能的組合方式。例如:n=6,組合方式有1+5,2+4,1+2+3。

N=20的例子:
#include <iostream.h>
bool visited[21];
bool c[40];
void get_arr(int b[],int i);
int main()
{
    int i,j,b[20];
    for(i=0;i<21;i++)
    visited[i]=0;
    for(i=0;i<40;i++)
    {
        for(j=2;j<i/2;j++)
        if(i%j==0)
        { c[i]=0;break;}
        if(j==i/2) c[i]=1;
    }
   c[4]=0;
    for(i=1;i<21;i++)
    {
        b[0]=i;
        visited[i]=1;
       get_arr(b,0);
       visited[i]=0;
    }
    return 0;
}

void get_arr(int b[],int i)
{
    int m,j;
    if(i>18)
    {
        if(c[b[0]+b[19]]==1)
        {
            for(m=0;m<20;m++)
            cout<<b[m]<<" ";
            cout<<endl;
       }
    }
    else
    {
      for(j=1;j<21;j++)
      if(visited[j]==0&&c[b[i]+j]==1)
      {
         b[i+1]=j;
       visited[j]=1;
        get_arr(b,i+1);
        visited[j]=0;
      }
    }
}
後記:未遇到相關應用

4.經典的四皇后問題
void Trial(int i,int n,int a[])
{
//n皇后問題 ,初始狀態沒有棋子(即a={0})
    int col,row,j,flag,k;
    if(i>=n)
    {
 for(col=0;col<n;col++)
    for(row=0;row<n;row++)     //輸出最終布局(1代表棋子所在位置)
    {
        cout<<a[col*n+row];
        if(row==n-1) cout<<endl;
    }
    cout<<endl;
    }
    else
    for(j=0;j<n;j++)
    {
        a[i*n+j]=1;
        flag=1;
        //在每個檢驗中加入了flag是否等於1的判斷,以提高速度
        for(col=0;col<n&&flag==1;col++)
        if(a[col*n+j]==1&&col!=i)        //檢驗行是否符合要求
        {flag=0;break;}
        for(row=0;row<n&&flag==1;row++)
        if(a[i*n+row]==1&&row!=j)       //檢驗列
        {flag=0;break;}
        for(k=i+j,col=k-n+1,row=n-1;col<n&&flag==1;row--,col++)
        if(a[col*n+row]==1&&col!=i)     //檢驗主對角線
          {flag=0;break;}
       if(flag==1)
       {
        //檢驗副對角線,分情況檢驗
        if(i<j)
        {
          for(k=i>j?i-j:j-i,col=0,row=k;row<n;row++,col++)
          if(a[col*n+row]==1&&col!=i)
            {flag=0;break;}
        }
        else
        {
       for(k=i>j?i-j:j-i,col=k,row=0;col<n;row++,col++)
          if(a[col*n+row]==1&&col!=i)
            {flag=0;break;}
        }
       }
      if(flag==1) Trial(i+1,n,a);
            a[i*n+j]=0;
    }
}

5.分治法.簡言之,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題.以此遞迴

int fun(int a[],int n,int x)
{
    //功能:求n次多項式的值,a[i]為x的i次方的常數項
    if(n==0)   return    (a[i]*x);
    else
    return (x*(fun(a,n-1,x)+a[i]));
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//hanoi問題
int count=0;
void move(char x,char y)
{
    printf("%c--->%c/n",x,y);
    count++;
}

void hanoi(int n,char one,char two,char three)
{
    //將n個盤從one座藉助two座,移到three座
    if(n==1) move(one,three);
    else
    {
        hanoi(n-1,one,three,two);
        move(one,three);
        hanoi(n-1,two,one,three);
    }
} 

 

遞迴函式在解決複雜演算法方面有很大的作用,比如著名的quicksort就是使用遞迴實現的.用好了它,可以事半公倍的幫你解決問題..

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.