1. 程式人生 > >遞迴應用 之 全排列、霍納法則

遞迴應用 之 全排列、霍納法則

其實遞迴的應用很廣,為毛老師當初只是一筆帶過~~~~~~~~~~~~~~~~~~~~~~

=========

什麼是遞迴:

簡單地說遞迴就是自己呼叫自己

=========

【遞迴解決問題雖然會佔用更多的堆疊,但是程式碼看起來很優美,符合問題的描述】

=========

什麼時候使用遞迴:

問題本身採用遞迴描述,比如我們所熟悉的斐波那契數

如何使用遞迴:

1)找到終止條件

 2)找到遞迴公式

例子:全排列問題:給出集合中所有元素的排列情況,例如(a, b, c )就有 abc , acb , bac , bca , cba , cab 

遞迴條件:如果可以找到n - 1的所有全排列就可以找到所有n 的全排列,只要迴圈一下集合就可以

例子來源【資料結構 c 語言版】

#include <stdio.h>
#include <stdlib.h>

#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))

void perm(char[], int , int);
int main(int argc, char *argv[])
{
  
  char list[3] = {'a','b','c'};
  perm(list, 0, 2);
  system("PAUSE");	
  return 0;
}


void perm(char *list, int i, int n)
{
     int j , temp;
     if(i == n)
     {
          for(j = 0 ; j <= n ; j ++)
                printf("%c",list[j]);
          printf("   ");
     }else
     {
          for(j = i; j <= n; j ++)
          {
                SWAP(list[i],list[j],temp);
                perm(list, i + 1, n);
                SWAP(list[i],list[j],temp);
          } 
     }   
}
<span style="font-family: Arial, Helvetica, sans-serif;">【霍納法則】</span>
int main(int argc, char *argv[])
{
  
  int a[] = {1, 1, 1, 1};
  
  int sum = horner(a, 0, 4, 2);
  printf("%d",sum);
  system("PAUSE");	
  return 0;
}

int horner(int a[], int i, int n, int x)
{
    if(i == (n - 1))
         return a[i]*x + a[i - 1];
    else
         return horner(a, ++i, n, x ) * x + a[i];
}