为什么我无法使用此程序获得正确数量的糖果?

时间:2017-06-18 16:53:31

标签: java

这项练习要求我们编写一个计算贫困孩子可以获得的糖果数量的计划。问题如下:

您被要求编写一个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.我的程序有什么问题?谢谢!

1 个答案:

答案 0 :(得分: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;
}