遞迴:整數劃分的java編程實現__編程

來源:互聯網
上載者:User

整數劃分:

     正整數n表示成一系列正整數之和:

     n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1),p(n)就是正整數n的不同劃分個數,即正整數的劃分數。

    那麼在正整數n的所有不同劃分中,把最大加數不大於m的劃分個數記作q(n,m)。那麼其遞迴關係如下:

(1)q(n,1)=1,n>=1

其中m=1,即最大加數只能為1,劃分情況只有一種:n=1+1+1+.....+1;

(2)q(n,m)=q(n,n),m>=n

由於最大加數大於等於正整數n,所有最大加數只能是n;

(3)q(n,n)=1+q(n,n-1)

最大加數為n時,只有一種情況。剩下的是最大加數為n-1時的劃分數;

(4)q(n,m)=q(n,m-1)+q(n-m,m) ,n>m>1

當正整數n大於最大加數m時,q(n,m-1)表示最大加數小於等於m-1時的劃分數,那麼再加上最大加數為m時的劃分數。最大加數為m時,最大加數已經固定了,剩下的就是正整數n減去最大加數m剩下的整數n-m的劃分數,即q(n-m,m)。

程式:

import java.util.Scanner;public class IntDivision {/** * 正整數n表示成一系列正整數之和: * n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1) * p(n)就是正整數n的不同劃分個數,即正整數的劃分數 */int intdivision(int n,int m){if (n<1||m<1) return 0;if(n==1||m==1) return 1;if(n<m) return intdivision(n, n);if(n==m) return intdivision(n, m-1)+1;return intdivision(n, m-1)+intdivision(n-m, m);}public static void main(String[] args) {Scanner in=new Scanner(System.in);System.out.print("輸入需要劃分的正整數");int n=in.nextInt();System.out.print("輸入最大加數");int m=in.nextInt();IntDivision id=new IntDivision();System.out.println("整數"+n+"在最大加數為"+m+"的情況下"+"的劃分數是:"+id.intdivision(n, m));}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.