整數數的劃分問題:就是把一個整數n劃分成一系列整數的和。當n=6時:
6;
5+1,
4+1+1,4+2;
3+1+1+1,3+2+1,3+3;
2+1+1+1+1,2+2+1+1,2+2+2;
1+1+1+1+1+1+1;
觀察上面的列表,可以得出觀察結論:對于每一行的第一個數字,總比上一行的數字小,且這一行都小于上一行,也就是基于更小的劃分。所以我們可以想到遞歸,但是怎么樣設計這個遞歸呢?就從“每一行是一個新的劃分,縮小問題的規模。得出Q(n,m)是對n的不大于m的劃分。然后我們在討論這個Q(n,m)函數問題!
1.m>n時:
對于n,對它進行m劃分,那么相當于對它進行n劃分。也就是Q(n,m)=Q(n,n);
2.m=n時:
對于這種劃分可以分成一個更小的規模,分成不大于n-1的劃分和1,這個1就是對n的劃分,就是n。所以Q(n,m)=(n,n-1)+1;
3.n>m時:
劃分成兩個字部分,首先對它進行不大于m-1的劃分,也就是Q(n,m-1),然后對它進行m的劃分,但總的成為n-m啦(想一下為什么?惡哈哈),為:Q(n-m,m).所以總的個數為:Q(n,m)=Q(n,m-1)+Q(n-m,m);
情況討論完了,現在該設計遞歸出口了:
當n=1||m=1時:顯然是1中劃分。
接下來我們該寫代碼了,如下:

 1/*
 2  Name: 整數的劃分
 3  Copyright: Copyleft
 4  Author:
 5  Date: 21-09-08 19:48
 6  Description:
 7*/

 8int main()
 9{
10    int n,m;
11    scanf("%d",&n);
12    m=divinteger(n,n);
13    printf("%d\n",m);
14    system("PAUSE");
15    return 0;
16}

17
18int divinteger(int n,int m)
19{
20    if(n<1||m<1)
21    {
22        printf("Error!\n");
23        exit(1);
24    }

25    if(n==1||m==1)
26    {
27        return 1;
28    }

29    else if(m>n)
30    {
31        return divinteger(n,n);
32    }

33    else if(n==m)
34    {
35        return divinteger(n,m-1)+1;
36    }

37    else
38    {
39        return divinteger(n,m-1)+divinteger(n-m,m);
40    }

41}

42
43
44
45
46
47
48
49