0

这是 Java 中的一种方法,int[] arr 中的(当 k == 0 时)具有 k 组合 int[] intems 之一。在变量 iloczyn 中计算了该组合中元素的乘积。在 tmp 中计算所有此类产品的总和。不幸的是,System.out.println(tmp) 显示,当函数结束时,tmp 等于 0。这很可悲,因为我需要这个变量来进行下一次计算。我该怎么办?

int tmp = 0;
public void kcomb(int[] items, int n, int k, int[] arr) 
{
    int iloczyn = 1;


    if (k == 0) {
        for(int i = 0; i< arr.length; i++){
            iloczyn*=arr[i];
        }
        tmp +=iloczyn;


    } else {
        for (int i = n; i <= items.length - k; i++) {
            arr[arr.length - k] = items[i];
            kcomb(items, i + 1, k - 1, arr);
        }
    }
    System.out.println(tmp);
}
4

4 回答 4

3

递归方法可能很棘手。你被烧毁了,因为你没有很好地处理方法的返回值。事实上,根本没有。

首先,按照@olicharlesworth 的建议进行操作并通过您的代码进行调试。这会很有启发性。

然后,要解决此问题,请考虑您的例程基本上有 2 个永远不会相遇的部分 - k==0 部分和另一个。这些部分中的每一个都应初始化 tmp 值,计算适合该部分的 tmp 值并将其返回给调用者

那么有问题的实例tmp变量将不是问题。

于 2012-05-15T22:09:52.537 回答
2

好吧,该方法并不总是打印 0 —— 我对其进行了测试,对于输入{1, 3, 5, 7}, 3, 1, {4, 3, 2, 1}它打印 168(两次)。当然,我不知道这些输入是否有意义。

您应该仔细考虑逻辑,看看代码是否真的在做您认为应该做的事情。@TonyEnnis 是正确的,使用返回值而不是副作用会使这变得更好(无论是在理解方面还是在编码实践方面)。

于 2012-05-15T22:18:39.310 回答
1

arr[] 中的任何值是否等于 0?如果这是真的,那么这个块:

for(int i = 0; i< arr.length; i++){
        iloczyn*=arr[i];
}

...总是会产生一个零。如果第一个值为零,则 iloczyn * 0 = 0,并且所有后续迭代也将为零。如果数组中的任何值为零,也会发生同样的事情......它们每次都会强制 iloczyn 设置为零。

单步执行代码并仔细检查 arr[] 的值,以确保确定。

于 2012-05-15T22:16:29.987 回答
0

除非我遗漏了什么,否则您只在 k==0 时设置 tmp。k 不会改变,因此在调用方法时它必须为非零。

于 2012-05-15T22:06:19.420 回答