遞迴演算法之因子分解
阿新 • • 發佈:2019-01-10
例一
以20為例遞迴過程為
#include <iostream> #include <string> #include <algorithm> #include <string.h> using namespace std; int sum; void cnt(int n,int min)//min這個引數保證因子是遞增的 { for(int i=min;i<n;i++) { if(n%i==0&&i<=n/i)//第二個條件保證因子遞增 { sum++; cnt(n/i,i); } } } int main(int argc, char *argv[]) { int num; cin >> num; while(num--) { int a; cin >> a; sum=1; cnt(a,2); printf("%d\n",sum); } return 0; }
例二:經典中的經典 漢諾塔問題
私以為遞迴演算法的兩個要素分別是1.遞迴出口2.遞迴法則。若沒有遞迴出口,遞迴程式將無限制執行下去。而遞迴法則便是將本問題和相同的但規模較小的子問題之間的轉化。
#include <iostream> #include <string> #include <algorithm> #include <string.h> using namespace std; int sum; void move(int n,char a,char b) { printf("%c->%d->%c\n",a,n,b); } void hanoi(int n,char aa,char bb,char cc) { if(n==1) move(1,aa,bb);//遞迴出口 else { hanoi(n-1,aa,cc,bb); move(n,aa,bb); hanoi(n-1,cc,bb,aa); } } int main(int argc, char *argv[]) { int num;char aaa,bbb,ccc; cin >> num >>aaa>>bbb>>ccc; hanoi(num,aaa,bbb,ccc); return 0; }