我想构建一个函数,其中一个参数是系列{x[i], i = 0, 1, ..., inf}
。
例如:x_m = 1/(1+x_(m-1)), m=1,2....inf
对于这个系列,我想检查每个x [i],如果它满足我将定义的某些条件(我不知道它将满足哪个n)。
例如:
如果x_0 < 5
,那么我将返回x_0的值。
如果没有 - 我会检查x_1
。如果x_1<5
,我将返回x_1
的值。
依旧......
注意:x_1
需要知道x_0
的计算值。
有一种简单的方法可以在Java中重新演绎这个系列吗?
答案 0 :(得分:2)
这只是部分答案:
作为一名数学家,我想说你可能想为系列定义一个界面,
方法double getElement(int m)
可能还有更多。
然后,您可能希望根据系列具有不同的实现类。
您可能有FormulaSeries
或RecursiveSeries
,其中系列由一些递归公式给出(如您的示例所示)。
此类可能在内部存储中间值,以供进一步使用(memoization)。
根据您的目标,您可以实施部分系列, 你只有有限数量的已知值,然后可以存储在列表或数组中。
如果我们关注RecursiveSeries
,如果公式很难计算,您可能希望将计算值内部存储在静态Map
中,并且您将需要多次元素。这不应该太难以理解。
答案 1 :(得分:2)
以下是您可能代表您尝试做的事情的方式。然而,我提供的和函数肯定不会。
首先,你的序列是一个重复,并在这里递归实现。你会想要记住它。我建议在SeriesUtil
中添加一些内容。
更重要的是,你显然无法将$ \ infinity $作为上限。你肯定知道,这是一个非常重要的问题。也就是说,您可以拥有各种实现Series
的抽象类,例如GeometricSeries
,它们具有已知的解决方案,并在给定系列类型的情况下使用适当的策略。
interface Series {
double x(int m);
}
class ExampleSeries implements Series {
public double x(int m) {
if (m == 0) {
return 0;
}
return 1 / (1 + x(m - 1));
}
}
class SeriesUtil {
public static double sum(Series series, int lowerBound, int upperBound) {
int sum = 0;
for (int i = lowerBound; i <= upperBound) {
sum += x(i);
}
return sum;
}
}
答案 2 :(得分:0)
显然,Ray&amp; Paxinum提供了您需要的指南。您所要做的就是调整它以适合您的情况。
但是如果出于学术目的而你的讲师需要看到你的详细脚本, 你可能会考虑这个。请注意,使用ArrayList而不是Array,因为 与后者不同,前者的限制可以重新定义。 您可以复制并粘贴以下代码,看看它是如何工作的。考虑将其编辑为 如果需要你的规格。我也提供了评论 - 他们尽可能多地解释代码。干杯!
import java.util.ArrayList;
import java.util.Scanner;
public class SeriesTest
{
// This internal class "Index", will represent an index Object that holds a
// value and returns the value when needed
class Index
{
private double idxElement;
private void setIdxElement(double value)
{
idxElement = value;
}
private double getIdxElement()
{
return idxElement;
}
}
// Create an Object index of type Index (i.e the class defined above)
Index index;
// Create an ArrayList, x_ , that will reference the index Objects.
ArrayList<Index> x_ = new ArrayList<Index>();
public void calculateResult()
{
System.out.println("How many elements do you want the series to have?");
Scanner input = new Scanner(System.in);
int NoOfelements = input.nextInt();
int value = 0;
// create a new instance of type Index
index = new Index();
// set the element held by this index as 0(zero)
// You can set this to any value depending on your Series' requirements
index.setIdxElement(value);
/*add the index object to the ArrayList
*This represents your x_m
*Note - This references the index Object that holds the value = 0 )*/
x_.add(index);
/* To do the same thing for the rest of the elements using
* your specified equation ---> x_m = 1/[ 1 + x_(m-1) ]*/
for (int m = 1; m < NoOfelements; m++ )
{
index = new Index();
// sets the value of the element referenced by the index object
// This represents your x_m = 1/[ 1 + x_(m-1) ]
index.setIdxElement( 1 / ( 1 + x_.get(m - 1).getIdxElement() ) );
// adds the index object to the ArrayList
x_.add(index);
}
}
public void displayResults()
{
// displays the series as referenced by the the ArrayList
// Note - ArrayList indexes start at 0(zero)
System.out.println("The series is:");
for ( int n = 0; n < x_.size(); n++ )
{
System.out.printf( "%.2f, ", x_.get(n).getIdxElement() );
}
}
public static void main(String[] args)
{
SeriesTest series = new SeriesTest();
series.calculateResult();
series.displayResults();
}
}