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))