我正在开发一个项目来创建一个系统,输入一个数字序列将为我提供最简单的多项式方程。现在我有一些问题,因为大多数新手现在都会有。我正在编写一个方法来执行以下操作:
重复计算序列中相邻数字之间的差异,直到序列中的每个数字相同:
[1,1,5,13,25]⇒[0,4,8,12]⇒[4,4,4]
新术语的指数是上面的步数,即2。
新术语的系数是最终序列上的数字除以指数的阶乘,即4/2!因此,新术语是2x ^ 2.
我所做的是创造三种方法。我不确定这是不是正确的方法,而是我所做的。
我创建了一种方法来查找输入序列之间的差异,然后将它们存储在另一个数组中。 (来自这里令人敬畏的社区的帮助很棒)
其次,我创建了一种方法来查找术语的阶乘。我正在写下面的两种方法以及一种查找所有术语是否相等的方法。
因子:
public int factorial(int x) {
for (int i=1;i<=x;i++){
x = x*i;
}
return x;
}
AllEqual:
public boolean allEqual() {
boolean checker = true;
double first = sequence[1];
for (int i = 1; i<sequence.length ; i++){
if(sequence[i] == first){
checker = true;
}
}
}
的差异:
public double[] differences() {
double[] diffs = new double[sequence.length - 1];
for(int i = 0;i<=sequence.length;i++){
diffs[i] = sequence[i+1]- sequence[i];
}
return null;
}
我知道我需要在循环中使用差异方法。我不确定这一点,因为如果我在循环中使用它然后在循环的下一次迭代中,循环应该在名为diffs的数组上运行而不是序列。
答案 0 :(得分:1)
嗯,一件好事就是改变你的differences
方法,使它或多或少地像这样:
public double[] differences(double[] sequence) {
double[] diffs = new double[sequence.length - 1];
for(int i = 0;i<=sequence.length;i++){
diffs[i] = sequence[i+1]- sequence[i];
}
return diffs;
}
通过这样做,我们将此方法转换为无副作用的函数。它仅适用于提供的参数并返回一些值(它具有参照完整性)。如上面其中一条评论所述,这种方法有一个巨大的优势。现在,您可以以多种不同的方式重用和组合对此函数的调用,而不必将其绑定到某个字段。
现在,您需要计算某个序列的差异,直到所有值都相等,并返回执行此操作所需的步骤数。你可以在这里使用递归解决方案
public int stepsUntilEqual(double[] sequence) {
if (allEqual(sequence)) {
return 0;
} else {
double[] diffs = differences(sequence);
return 1 + stepsUntilEqual(diffs); //One more steps that the steps needed to get the differences equal
}
}
你会注意到&#34; allEqual&#34;函数也必须更改为使用参数而不是字段
public boolean allEqual(double[] sequence) {
...
}
非递归解决方案 自从访问最后的差异&#34;在这种情况下,可能需要一个非递归解决方案:
double[] lastSequence = sequence;
int steps = 0;
while ( !allEqual(lastSequence)) {
lastSequence = differences(lastSequence);
steps++;
}
//Now steps contains the number of iterations
//lastSequence contains the value you will to use for calculating the coefficient