如何调用递归调用N次,给定数量N?

时间:2017-05-22 07:51:50

标签: java arrays recursion

我有一组数字:S= {4,5}我想检查这个组是否创建了sum = 13

在这种情况下,是:4 + 4 + 5 = 13

另一个例子:s={4,5}sum = 6 - >的没有

我写了一个递归函数来解决这个问题:

public static boolean isSumOf(int [] s,int n)
    {
        if(n == 0)
            return true;
        if(n < 0)
            return false;

        return isSumOf(s,n-s[0]) || isSumOf(s,n-s[1]);
    }

但是此功能仅适用于阵列中的2个数字。 我需要编写一个递归函数来处理N个数字,比如{4,9,3}{3,2,1,7}等。

我不知道怎么能这样做?如何根据数组的长度调用递归N次?或者我可能完全改变我的算法? 另外 - 我不允许使用循环。

4 个答案:

答案 0 :(得分:4)

return isSumOf(s,n-s[0]) || isSumOf(s,n-s[1]);

您可以使用循环来概括此

for (int i = 0; i < s.length; ++i) {
  if (isSumOf(s,n-s[i])) return true;
}
return false;

但是,既然你不能使用循环,你可以将等效循环写为另一种递归方法:

boolean withoutLoop(int [] s,int n, int i) {
  if (i >= s.length) return false;
  return isSumOf(s,n-s[i]) || recurse(s, n, i+1);
}

然后从isSumOf方法调用它:

public static boolean isSumOf(int [] s,int n)
{
    if(n == 0)
        return true;
    if(n < 0)
        return false;

    return withoutLoop(s, n, 0);  // Change here.
}

或者,如果你想更简洁地写它:

return (n == 0) || (n < 0 && withoutLoop(s, n, 0));

答案 1 :(得分:0)

打破问题:

  1. 数字总和
  2. 总和是否等于13?
  3. 然后想办法表达将数组求和为递归任务;例如元素1到N的和是元素1 +元素2到N的和。

    最后,将该想法/表达式转换为代码。

答案 2 :(得分:0)

对于任何递归问题,请使用模板:

ResultType recursiveMethod(params) {
     if( /* this is the simplest case */ ) {
         return answer for the simplest case
     } else {
         partialResult = solve part of the problem
         resultForRest = recursiveMethod(rest of problem)
     }
}

特别是对于列表处理,这变为:

if(list is empty) {
    return solution for an empty list
} else {
    r = call self recursively for tail of list
    return solution for head of list combined with r
}

(其中&#34;头&#34;是第一项,&#34;尾巴&#34;是其余的。尾巴可能是空的。)

对于您的问题,最简单的情况是一个空数组:

 if(s.length == 0) {
      return n == 0;
 }

对于else问题&#34;部分问题&#34;是s[0]和问题的其余部分&#34;是s[1]以后。

 ... 
 } else {
     int head = s[0];
     int[] tail = Arrays.copyOfRange(s,1,s.length-1);
     return isSumOf(tail, n - head);
 }

如果您直接使用List代替数组,则代码会更干净(也可能更有效),因为您可以使用List.subList()代替copyOfRange()

你也可以每次传递整个数组,还有一个额外的参数,表明已经考虑了多少数组。

答案 3 :(得分:-1)

这应该有效:

public static boolean isSumOf(int [] s,int n)
    {
        if(n == 0)
            return true;
        if(n < 0)
            return false;

        for (int x: s) {
            if (isSumOf(s, n-x)) {
                return true;
            }
        }
        return false;
    }

更新:

哦!没有循环,只有递归,你需要一个额外的参数:

public static boolean isSumOf(int [] s,int n)
    {
        if(n == 0)
            return true;
        if(n < 0)
            return false;

        return isSum2(s, n, 0);
    }

public static boolean isSum2(int [] s,int n,int i)
    {
        if (i >= s.length)
            return false;

        return isSumOf(s,n-s[i]) || isSum2(s,n,i+1);
    }