public class StampaInversa {

private static class NumberWithCounterAndAverage{
    private int number=0;
    private int counter=1;
    private int average=0;
    public int getNumber(){
        return number;
    }
    public int getCounter(){
        return counter;
    }
    public void setNumber(int number){
            this.number=number;
    }
    public void setCounter(int counter){
        this.counter+=counter;
    }

    public int getAverage(){
        return avrage;
    }
    public void setAverage(int average){
        this.average=average;
    }

    public String toString(){
        return "Number: "+number+"Counter "+counter+"Average "+average;
    }//toString
}//NumeroConContatore

public static void reversePrint(){
    Scanner sc= new Scanner(System.in);
    System.out.println("Insert number");
    int x=sc.nextInt();
    if(x==0) return;
    reverseprint();
    System.out.println(x);
}

public static int sumPrint(){
    Scanner sc=new Scanner(System.in);
    System.out.println("Insert number");
    int x=sc.nextInt();
    if(x!=0) x+=sumPrint();
    return x;
}

public static NumberWithCounterAndAverage printAverage(){
    Scanner sc=new Scanner(System.in);
    NumberWithCounterAndAverage ncc= new NumberWithCounterAndAverage();
    System.out.println("Insert number");
    int x=sc.nextInt();
    if(x!=0){
        NumberWithCounterAndAverage nccem= printAverage();
        ncc.setNumber(x+nccem.getNumber());
        ncc.setCounter(+nccem.getCounter());
    }
    if (x!=0){
        ncc.setAverage(ncc.getNumber()/(ncc.getCounter()-1));
    }
    return ncc;
}

public static void main(String[] args) {
    NumberWithCounterAndAverage nccem= printAverage();
    System.out.println(nccem.getCounter()+" "+nccem.getNumber()+" average "+nccem.getAverage());
}
}//StampaInversa


我的教授给了我一个任务:编写尾部递归函数来计算:
从输入到0插入的数字的总和;
直到插入0为止的平均插入数量;
直到插入0为止所插入数字的标准差;

完成任务的条件是:
不允许使用任何数据结构(数组,arraryslist,LinkedList ...),仅允许即席对象(例如我创建的对象:NumberWithCounterAndAverage)
不允许使用等距变量,这些变量必须仅由函数拥有。
该函数必须是递归的。

上面代码中的函数可以完美地工作,但是现在我需要制作一个递归函数,以使用上述条件计算标准差。你有什么线索吗?

如果仍然不清楚该功能应该如何,请告诉我。

最佳答案

我认为您应该追求的想法是拥有一个函数,该函数将计算所需的当前计数,总和,平均值等作为参数。这将满足您对没有实例变量的要求,这与上面的内容不同。

对此方法的第一次调用将传递全零。每个后续调用将读取一个值,如果不为0,则使用更新后的值自行调用。如果为零,则进行最终计算并输出结果。

答案是在这篇文章:How to efficiently calculate a running standard deviation?

通过此计算:让该方法接受sum_x,sum_x2和count。 (sum_x是元素之和,sum_x2是平方和)。在收到0的迭代中,结果为:

sum = sum_x
average = sum_x / count
stdev = sqrt((sum_x2 / count) - (average * average))

10-07 19:45
查看更多