2017-06-18 17 views
-2

這個練習要求我們編寫一個計算貧困孩子可以得到的糖果數量的程序。問題如下:爲什麼我不能使用這個程序得到正確數量的糖果?

你被要求寫一個Java程序來幫助這些可憐的孩子回答這個問題。爲了推廣該解決方案,您的程序應該能夠接受n和m的不同值作爲輸入,其中n = 10,m = 2。爲了避免無限數量的答案,你可以假設每個糖果都有一個箔片,並且不允許切割箔片。

我遵循給出的提示使用提供的公式和java遞歸編寫程序。

import java.util.Scanner; 

public class MyFirstClass{ 
    public static void main(String args[]){ 
     Scanner a=new Scanner(System.in); 
     int n=0,m=0; 
     n = a.nextInt(); 
     m = a.nextInt(); 
     System.out.println("Candy " +n+" "+ m + " n="+ n+";m="+m+";No. of Candies="+total(n,m)); 
    } 
    static int sum=0; 
    static int total(int n, int m) 
    { 
     int sum1=n; 
     sum1+=candy(n,m); 
     return sum1; 
    } 
    static int candy(int n,int m){ 
     if((n+n%m)/m>1){ 
      sum+=n/m+candy((n+(n%m))/m,m); 
     } 
     return sum; 
    } 
} 

然而,當我集合n = 10且m = 2,糖果的計算的總數量小於由1實際總數糖果的什麼是我的節目的問題?謝謝!

+0

這是一個好時機,開始學習如何使用調試器。 – OldProgrammer

+0

你能幫助我們理解你的公式嗎?請解釋他們。到底發生了什麼?否則,我們需要一些時間來進入它,許多人不願意這樣做。 – Zabuza

+0

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然遇到問題,請隨時返回一個[最小,完整且可驗證的示例](http://stackoverflow.com/help/mcve),以說明您的問題。 –

回答

1

對於你的糖果功能:

static int candy(int n,int m){ 
    if((n+n%m)/m>1){ 
     sum+=n/m+candy((n+(n%m))/m,m); 
    } 
    return sum; 
} 

它是如何即使編譯時sum是不確定的?

在任何情況下,candy函數都需要檢查第一個參數爲0或1時的邊界條件。並且我將假設負數也是無效的輸入。

int candy(int n, int m) { 
    if ((n <= 1) || (m == 0)) { 
     return 0; 
    } 
    return n/m + candy(((n+n%m)/m), m); 
} 

而且由於它的「尾遞歸」,可以實現while循環整個事情:

int candy(int n, int m) { 

    int result = 0; 

    while ((n > 1) && (m != 0)) 
    { 
     result += n/m; 
     n = (n+n%m)/m; 
    } 

    return result; 
} 
相關問題