Java中如何从递归中取出变量?

Java中如何从递归中取出变量?,java,recurrence,Java,Recurrence,这是Java中的一个方法,在int[]arr中(当k==0时)有一个k组合int[]intem。在变量中,iloczyn是该组合中元素的计算乘积。在tmp中,计算所有此类产品的总和。不幸的是,System.out.println(tmp)显示,当函数结束时,tmp等于0。这是非常悲哀的,因为我需要这个变量来进行下一次计算。我该怎么办 int tmp = 0; public void kcomb(int[] items, int n, int k, int[] arr) { int il

这是Java中的一个方法,在int[]arr中(当k==0时)有一个k组合int[]intem。在变量中,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);
}
inttmp=0;
公共无效kcomb(int[]项,int n,int k,int[]arr)
{
int-iloczyn=1;
如果(k==0){
对于(int i=0;i对于(int i=n;i除非我遗漏了什么,否则你只能在k==0时设置tmp。k不改变,所以在调用方法时它必须是非零的。

除非我遗漏了什么,否则你只能在k==0.k不改变时设置tmp,所以在调用方法时它必须是非零的。

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

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

然后,为了解决这个问题,考虑到你的例程基本上有2个不满足的片段——k==0个片段,另一个部分应该初始化TMP值,计算适合该部分的TMP值并将其返回给调用方。


那么有问题的实例tmp变量就不会有问题了。

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

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

然后,为了解决这个问题,考虑到你的例程基本上有2个不满足的片段——k==0个片段,另一个部分应该初始化TMP值,计算适合该部分的TMP值并将其返回给调用方。


那么有问题的实例tmp变量将不会出现问题。

arr[]中的任何值是否等于零?如果为真,则此块:

for(int i = 0; i< arr.length; i++){
        iloczyn*=arr[i];
}
for(int i=0;i
…将始终生成一个零。如果第一个值为零,则iloczyn*0=0,所有后续迭代也将等于零。如果数组中的任何值为零,则会发生相同的情况…它们将强制iloczyn每次都设置为零


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

arr[]中的任何值是否等于零?如果为真,则此块:

for(int i = 0; i< arr.length; i++){
        iloczyn*=arr[i];
}
for(int i=0;i
…将始终生成一个零。如果第一个值为零,则iloczyn*0=0,所有后续迭代也将等于零。如果数组中的任何值为零,则会发生相同的情况…它们将强制iloczyn每次都设置为零


一步一步地检查代码并仔细检查arr[]的值,以确保其正确性。

好吧,该方法并不总是打印0--I,对于输入
{1,3,5,7},3,1,{4,3,2,1}
它打印168(两次)。当然,我不知道这些输入是否有任何意义


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

好吧,该方法并不总是打印0--I和输入
{1,3,5,7},3,1,{4,3,2,1}
它打印168(两次)。当然,我不知道这些输入是否有任何意义


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

使用调试器找出代码在做什么?要更快地获得更好的帮助,请尝试发布一个使用调试器找出代码在做什么?要更快地获得更好的帮助,请尝试发布一个
k
是否“更改”--其中有一个递归调用。
k
是否“更改”--其中有一个递归调用。