java - 使用递归(java)查找给定数字是否是给定集合(允许重复)的总和

标签 java recursion sum subset stack-overflow

我试图找出给定数字是否是给定集合的总和, 例如:数字 12 是集合 s{3,2} 的总和, 因为:

3+3+3+3=12
or
2+2+2+2+2+2=12

但是 14 不是 s{8,10} 的总和,因为你不能用 创建数字 14 s 的总和。 我正在尝试仅使用递归而不使用循环在 java 中编写代码。 这是代码:

   public static boolean isSumOf(int[]s,int n)
   {
     return isSumOf(s,n,0,0,0);
   }


   private static boolean isSumOf(int[]s,int n,int i,int sum,int m)
   {
       boolean with=false;
       boolean without=false;

       if(i==s.length)
        return false;

       if(sum==n)   
        return true;

       if(m<=n)
        {
            with=isSumOf(s,n,i,sum+s[i]*m,m++);
            without=isSumOf(s,n,i,sum,m++);            
        }
       else
        {
            i=i++;
            m=0;
            isSumOf(s,n,i,sum,m);
        }

       return (with||without); 

   }

代码编译正常,但在运行测试时出现 stackOverFlowError。 这是测试代码:

  public static void main(String[]args)
  {  
      int[]a={18,10,6};
      int x=18+10+6;
      System.out.println(Ex14.isSumOf(a,x));
  }

请帮忙!!!

最佳答案

这看起来很糟糕:

with=isSumOf(s,n,i,sum+s[i]*m,m++);
without=isSumOf(s,n,i,sum,m++);

使用

with=isSumOf(s,n,i,sum+s[i]*m,++m);
without=isSumOf(s,n,i,sum,++m);

如果你想在被调用的方法中有一个更高的m

除此之外,由于变量命名不当,我不知道代码做了什么。

还有这一行:

i=i++;

没有效果,如果要增加 i,请将其替换为以下内容之一:

i++;
i += 1;
i = i + 1;
i = ++i;

如果你不使用调用的结果

isSumOf(s,n,i,sum,m); 

调用它没有意义。

关于java - 使用递归(java)查找给定数字是否是给定集合(允许重复)的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13641835/

相关文章:

Javascript递归导致循环结构

C 递归函数 - 在 main 中调用函数显示不正确的值

java - Android 改造 - HTTP 失败 : java.net.UnknownHostException:无法解析主机 {我的基本 url}:没有与主机名关联的地址

java - 尝试使用递归提出解决方案

java - 如何访问 "unnamed"类的方法?

python - 递归找零算法

java - 用户填充的 ListView 中的 TextView 值的总和

r - R中字符串中由竖线分隔的数字总和

java - 绑定(bind)两个 JComboBox 过滤器

java - 什么时候消息传递(例如 JMS)是多线程的替代方案?