1. 程式人生 > >遞迴演算法之因子分解

遞迴演算法之因子分解

例一


以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;
}