遞迴應用 之 全排列、霍納法則
阿新 • • 發佈:2018-12-30
其實遞迴的應用很廣,為毛老師當初只是一筆帶過~~~~~~~~~~~~~~~~~~~~~~
=========
什麼是遞迴:
簡單地說遞迴就是自己呼叫自己
=========
【遞迴解決問題雖然會佔用更多的堆疊,但是程式碼看起來很優美,符合問題的描述】
=========
什麼時候使用遞迴:
問題本身採用遞迴描述,比如我們所熟悉的斐波那契數
如何使用遞迴:
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]; }