我一直在努力弄清楚如何使我的程序工作。我追查了我的代码并没有给我正确答案!!!!我试图在不使用递归的情况下解决这个问题。
到目前为止,这是我的工作:
int numberOfWaysToMultiply(int numberOfMatrices){
in[] myArray = new int[numberOfMatrices];
int i;
myArray[1] = 1;
myArray[2] = 1;
int result = 0;
if(numberOfMatrices >= 3){
for( i = 3; i <= numberOfMatrices; i++){
result += myArray[i - 1] * myArray[i - 2];
myArray[i] = result;
}
}
return myArray[numberOfMatrices];
}
答案 0 :(得分:2)
这是我观察到的。
您有最终结果的说明。你可以使用一些完全不同的随机代码。你不知道如何从你所在的地方到达你需要的地方。
您需要做的是首先手动解决问题。实际上坐下来,试着找出如何得到f(3)
的答案。对于f(4)
。等等。
执行此操作后,您会发现在f(n)
之前无法生成f(1), f(2), ..., f(n-1)
。你会发现生成每一个都需要所有其他的。
尝试计算出模式。把它变成评论。逐步展开。所以你可以从这开始:
// f(1) = 1
// f(2) = 2
// for n = 3 to numberOfMatrices
// find f(n)
// return f(numberOfMatrices)
然后展开find f(n)
位。
// f(1) = 1
// f(2) = 2
// for n = 3 to numberOfMatrices
// f(n) = 0
// for i = 1 to n-1
// f(n) += f(i) * f(n-i)
// return f(numberOfMatrices)
现在你有了算法。将每条评论转换为代码,您应该得到答案。我不会通过这样做完成你的作业,但它应该是直截了当的。您将f(n)
存储为myArray[n]
等等。
BTW错误警告。 Java中的数组总是从0开始。因此,您需要f(n)
为myArray[n-1]
或者使myArray
比现在大一些。
答案 1 :(得分:0)
与第一个答案相同。只需键入2分钟:)
你的实施完全错了。 只需检查您为numberOfMatrices = 4计算的内容。 首先,定义一个太小而不能容纳f(n)的数组。之后
int[] myArray = new int[numberOfMatrices];
你有一个包含4个元素的数组。从myArray [0]到myArray [3]。 稍后在for循环的最后一次迭代中,您将尝试设置myArray [4]。 我们假设您已更正此行,并声明
int[] myArray = new int[numberOfMatrices+1];
让我们循环遍历循环,看看会发生什么。
第1步
i = 3,结果= 0,myArray = [0,1,1,0,0](不要忘记索引为0的元素)。
结果+ = myArray [1] * myArray [2] =&gt;结果= 0 + 1 * 1 =&gt;结果= 1
myArray [3] = result =&gt; myArray [3] = 1
第2步
i = 4,结果= 1,myArray = [0,1,1,1,0]
结果+ = myArray [2] * myArray [3] =&gt; result = 1 + 1 * 1 =&gt;结果= 2
myArray [4] = result =&gt; myArray [4] = 2
因此,在最后一次迭代之后,您将拥有以下int数组:[0,1,1,1,2]
您需要的是:
int[] f = new int[numberOfMatrices+1];
f[1] = 1;
f[2] = 1;
for(int i = 3; i<=numberOfMatrices; i++){
for(int k=1; k < i; k++){ // k will be max. i-1
f[i] += f[k]*f[i-k];
}
}
答案 2 :(得分:0)
你正在尝试计算n! (阅读:&#34; n factorial&#34;或&#34; n和#34的阶乘;)
int f = 1;
for(int i = 1; i<=numberOfMatrices; i++){
f = f * i;
}
return f;
注意:即使int
的值较小,这也会溢出Java numberOfMatrices
。