我想基于两个输入递归生成数组:
1( 输入阵列,例如double[] in={0.25, 0.25, 0.5};
2( 步长,例如double step = 0.25;
函数foo()
应该接受这两个输入并生成以下数组:
{0.5, 0.25, 0.5} (add step 0.25 to first element)
{0.0, 0.25, 0.5} (subtract 0.25 from first element)
等等
所有2^d组合(此处d=3(。但我想递归地执行,而不指定维度(d(。
public void foo( double[] inatt, double[] outatt, double step, int d)
{
if( d = 0 )
{
// should print the array outatt:
}
else
{
outatt[d] = inatt[d]+step;
foo( inatt, outatt, step, d-1);
}
}
我不知道如何组织递归函数内部的调用。。我想,如果维度(d(的数量事先不知道,那么它就是我应该用来递归控制调用的变量吗?
目前您的解释与您的示例相矛盾。如果d=3
有8个组合,我假设您希望组合像(add, add, add)
、(add, add, subtract)
…这样的操作。。。,(subtract, subtract, add)
、(subtract, subtract, subtract)
。然而,在您的示例中有(add, no-change, no-change)
和(subtract, no-change, no-change)
。我认为那个例子不正确。
我建议添加d
而不是减法,从0
开始,当d == inatt.length
时打印(为什么是inatt
?inarr
?(:
public void foo( double[] inatt, double[] outatt, double step, int d)
{
if( d == inatt.length )
{
System.out.println(Arrays.toString(outatt));
}
else
{
outatt[d] = inatt[d]+step;
foo( inatt, outatt, step, d+1);
outatt[d] = inatt[d]-step;
foo( inatt, outatt, step, d+1);
}
}
输入(foo(new double[] {0.25, 0.25, 0.5}, new double[3], 0.25, 0);
(的结果为:
[0.5, 0.5, 0.75]
[0.5, 0.5, 0.25]
[0.5, 0.0, 0.75]
[0.5, 0.0, 0.25]
[0.0, 0.5, 0.75]
[0.0, 0.5, 0.25]
[0.0, 0.0, 0.75]
[0.0, 0.0, 0.25]
如果你想要其他东西,请澄清这个问题(至少提供完整的预期输出(。
多亏了Tagir,我用他有用的代码找到了解决方案。数组中的每个元素都有三种情况:加步长、减步长或不更改。
递归调用从数组中的第一个元素开始,然后一直持续到最后一个元素。
public static void foo( double[] inatt, double[] outatt, double step, int d)
{
if( d == inatt.length )
{
System.out.println(Arrays.toString(outatt));
}
else
{
outatt[d] = inatt[d]+step;
foo( inatt, outatt, step, d+1);
outatt[d] = inatt[d]-step;
foo( inatt, outatt, step, d+1);
outatt[d] = inatt[d];
foo( inatt, outatt, step, d+1);
}
}
对于输入阵列:
double[] att={0.25, 0.5};
double step = 0.25;
这是输出:
foo(att, new double[d], delta, 0);
[0.5, 0.75]
[0.5, 0.25]
[0.5, 0.5]
[0.0, 0.75]
[0.0, 0.25]
[0.0, 0.5]
[0.25, 0.75]
[0.25, 0.25]
[0.25, 0.5]