Java 使用递归进行子集求和?

Java 使用递归进行子集求和?,java,recursion,Java,Recursion,我在java课上被一个问题难住了,我的大学也是如此。我想问一些建议,因为我不知道从哪里开始。我们的赋值要求获取输入“正整数和目标值列表,并确定输入整数的多少子集(如果有)与每个给定目标值相加。” 如果我们有投入: 2 3 4 5 一, 四, 五, 我们的产出应该是: 0 一, 二, 我明白这一点,也知道如何做到这一点,但我在两点上迷失了方向 1,我们必须为此使用递归,#2,我们提供了基本代码。我所需要的只是理解如何使用框架代码的一些帮助。我想自己解决这个问题。一个使用代码的小示例或所需内容的一小

我在java课上被一个问题难住了,我的大学也是如此。我想问一些建议,因为我不知道从哪里开始。我们的赋值要求获取输入“正整数和目标值列表,并确定输入整数的多少子集(如果有)与每个给定目标值相加。” 如果我们有投入:

2 3 4 5

一,

四,

五,

我们的产出应该是: 0

一,

二,

我明白这一点,也知道如何做到这一点,但我在两点上迷失了方向

1,我们必须为此使用递归,#2,我们提供了基本代码。我所需要的只是理解如何使用框架代码的一些帮助。我想自己解决这个问题。一个使用代码的小示例或所需内容的一小部分将非常有用! 谢谢大家!

所给代码:

static int subsets( int[] a, int n, int target) {

// add your code here
}

public static void main(String args[]) throws IOException {

int a[] = new int[1000];


Scanner scanner = new Scanner(System.in);
Scanner setScanner = new Scanner(scanner.nextLine());

    int n=0;
    while( setScanner.hasNextInt() ) {
    a[n] = setScanner.nextInt();
    n++;
    if(n>1000) {
        System.out.println( "Too many integers!" );
        return;
    }
    }

    while( scanner.hasNextInt() ) {
    int target = scanner.nextInt();
    System.out.println( subsets(a, n, target) );
}

}

}

因为这是一个家庭作业问题,我不会给你任何代码;相反,我将给您一些指针(在提示中,而不是在
C
指针中)

问题在于确定求和的子集数。因此,您可以使用数组和和作为参数的和定义一个函数。循环遍历数组中的每个元素,并将以下参数再次传递到同一个函数中:不包含当前元素的数组,以及
sum-current\u元素
。我会让你决定如何停止

提示:

当总和小于零时,意味着有一个子集总和为正确的值。您需要将全局值增加1。当总和小于零时,表示最后一个值失败,您将希望停止递归

另一个问题:
scanner.hasNextInt()
无法按预期工作。您要做的是查找
n
,然后查找数组的元素

第一行应该是
int number\u of\u elements=scanner.nextInt()
。此变量表示数组中的元素数

然后,您需要读取一个整数
元素的数量\u
次。比如说:

for (int i = 0; i < number_of_elements; i++) {
    // Read another number
}
for(int i=0;i

这样,您就可以将
a
初始化为
int[]a=newint[number\u of\u elements]
,这样您的数组长度就正好合适。使用此方法,您只需要一个扫描仪,并且您的数组长度可以达到
整数。MAX_VALUE

,因为这是一个家庭作业问题,所以我不会给您任何代码;相反,我将给您一些指针(在提示中,而不是在
C
指针中)

问题在于确定求和的子集数。因此,您可以使用数组和和作为参数的和定义一个函数。循环遍历数组中的每个元素,并将以下参数再次传递到同一个函数中:不包含当前元素的数组,以及
sum-current\u元素
。我会让你决定如何停止

提示:

当总和小于零时,意味着有一个子集总和为正确的值。您需要将全局值增加1。当总和小于零时,表示最后一个值失败,您将希望停止递归

另一个问题:
scanner.hasNextInt()
无法按预期工作。您要做的是查找
n
,然后查找数组的元素

第一行应该是
int number\u of\u elements=scanner.nextInt()
。此变量表示数组中的元素数

然后,您需要读取一个整数
元素的数量\u
次。比如说:

for (int i = 0; i < number_of_elements; i++) {
    // Read another number
}
for(int i=0;i

这样,您就可以将
a
初始化为
int[]a=newint[number\u of\u elements]
,这样您的数组长度就正好合适。使用这种方法,您只需要一个扫描程序,并且您的数组可以长到整数。最大值递归算法的目的是使问题变小,并使用较小问题的结果来解决较大问题,因此当调用子集(a,n,target)时,它应该这样做

一个是当前数组 n是数组中的数字数 目标就是目标

要做的第一件事是检查a中的所有数字加起来是否符合目标


然后它需要知道是否有任何子集与目标匹配。谁最好用修改后的a和n来问自己。

递归算法的目的是使问题更小,并使用较小问题的结果来解决较大问题,因此当调用子集(a,n,target)时,它应该这样做

一个是当前数组 n是数组中的数字数 目标就是目标

要做的第一件事是检查a中的所有数字加起来是否符合目标


然后它需要知道是否有任何子集与目标匹配。还有谁比用修改后的a和n来问自己更好。

非常感谢。我对你的解释有疑问,所以当你说定义一个函数时,我们得到了函数的静态int子集(int[]a,int n,int target){要使用,我是在函数中创建函数?还是使用给定的函数?@Kajamaz您只需要使用给定的函数。在Java中创建嵌套函数是不可能的。好的,谢谢。所以,您说循环遍历每个元素,但这就是我所不知道的。我以前做过二进制搜索。这就是我们正在尝试的吗?我一直按en是偶然的。所以,从我想做的,请告诉我如果我错了,做一个if语句来检查n@Kajamaz二进制搜索不是你想要的。你只需要一个基本的
for
循环,从
0
循环到
n
。我正要问你一个关于for循环的问题,我真的很感激。我看到了