如何求和给定元素左侧的 N 个数组元素?
How to sum up N array elements, to the left of the given element?
对不起,如果问题令人困惑,我是编程新手,我不知道如何表述它,甚至 Google 多次都听不懂我的意思。
我正在尝试求解某种斐波纳契数列,但不是对最后 2 个数求和,而是对最后 N 个数求和。
public double[] sequenceSum(double[] sequence) {
//some fancy method here
}
其中 sequence.length 实际上是您应该求和的数字。
所以如果调用是:
seqeunceSum(1,2,3,4);
...序列应继续 {1,2,3,4,10,18,35,67...}。
如果来电是:
seqeunceSum(1,0,1,0,1);
...序列应继续 {1,0,1,0,1,3,5,10,19,38....}。
序列当然有其限制,否则它会是无限的,但我只需要帮助如何求和左侧的 N 个数组元素
非常感谢,
EDIT:
谢谢,我从这里听取了一些意见并解决了它。
是的,序列有限制,很抱歉没有将其包含在参数中,我根据之前的建议判断要问最小和具体的问题。
这是我的代码:
public double[] sequenceSum(double[] sequence, int n) {
double[] xArray = Arrays.copyOf(sequence, n);
for(int i = sequence.length; i<n; i++){
double sum = 0;
for (int j=(i-sequence.length); j < i; j++) {
sum += xArray[j];
}
xArray[i] = sum;
}
return xArray;
}
}
谢谢大家,
最佳做法是保留可在 own/separate 函数中重复使用的相同功能,这样您就可以在程序的其他任何地方使用它。
(同时它使您的代码更加结构化和可读性)
因此将以下函数添加到您的代码中:
public double sumAll(double[] numbers) {
double result = 0;
for(int i = 0 ; i < numbers.length; i++){
result += numbers[i];
}
return result;
}
然后您可以在 sequenceSum 函数中调用它,例如:
double sum = sumAll(sequence);
// Your code to create the next sequence elements...
另一个提示:如果您只是将此函数用于斐波那契数列和类似的整数问题,请使用数据类型 int,因为浮点数(在本例中为双精度)累加浮点数 "noise"。 (你找到关于这个问题的信息here)
首先,您应该对整数求和而不是对双精度求和。如有必要,您可以将整数转换为双精度数。
其次,您需要包含停止条件。我建议总长度。这将使方法签名:
public int[] sequenceSum(int[] sequence, int length)
我不会给你代码,我只会给你编写代码所需的步骤:
创建长度为 length 的 int 输出数组。
获取序列长度。
将序列数组复制到输出数组。
对从索引 0 到索引序列长度 - 1 的序列值求和,并将总和添加到输出数组。
重复第4步,开始索引加1,结束索引加1,直到输出数组满
对不起,如果问题令人困惑,我是编程新手,我不知道如何表述它,甚至 Google 多次都听不懂我的意思。
我正在尝试求解某种斐波纳契数列,但不是对最后 2 个数求和,而是对最后 N 个数求和。
public double[] sequenceSum(double[] sequence) {
//some fancy method here
}
其中 sequence.length 实际上是您应该求和的数字。 所以如果调用是: seqeunceSum(1,2,3,4);
...序列应继续 {1,2,3,4,10,18,35,67...}。
如果来电是: seqeunceSum(1,0,1,0,1); ...序列应继续 {1,0,1,0,1,3,5,10,19,38....}。
序列当然有其限制,否则它会是无限的,但我只需要帮助如何求和左侧的 N 个数组元素
非常感谢,
EDIT:
谢谢,我从这里听取了一些意见并解决了它。
是的,序列有限制,很抱歉没有将其包含在参数中,我根据之前的建议判断要问最小和具体的问题。
这是我的代码:
public double[] sequenceSum(double[] sequence, int n) {
double[] xArray = Arrays.copyOf(sequence, n);
for(int i = sequence.length; i<n; i++){
double sum = 0;
for (int j=(i-sequence.length); j < i; j++) {
sum += xArray[j];
}
xArray[i] = sum;
}
return xArray;
}
}
谢谢大家,
最佳做法是保留可在 own/separate 函数中重复使用的相同功能,这样您就可以在程序的其他任何地方使用它。 (同时它使您的代码更加结构化和可读性)
因此将以下函数添加到您的代码中:
public double sumAll(double[] numbers) {
double result = 0;
for(int i = 0 ; i < numbers.length; i++){
result += numbers[i];
}
return result;
}
然后您可以在 sequenceSum 函数中调用它,例如:
double sum = sumAll(sequence);
// Your code to create the next sequence elements...
另一个提示:如果您只是将此函数用于斐波那契数列和类似的整数问题,请使用数据类型 int,因为浮点数(在本例中为双精度)累加浮点数 "noise"。 (你找到关于这个问题的信息here)
首先,您应该对整数求和而不是对双精度求和。如有必要,您可以将整数转换为双精度数。
其次,您需要包含停止条件。我建议总长度。这将使方法签名:
public int[] sequenceSum(int[] sequence, int length)
我不会给你代码,我只会给你编写代码所需的步骤:
创建长度为 length 的 int 输出数组。
获取序列长度。
将序列数组复制到输出数组。
对从索引 0 到索引序列长度 - 1 的序列值求和,并将总和添加到输出数组。
重复第4步,开始索引加1,结束索引加1,直到输出数组满