当前位置: 首页 > 知识库问答 >
问题:

返回方程 x1 的解数 x2 x3 = num

楚元章
2023-03-14

我正在尝试编写一个递归方法,它接受作为正整数num参数并返回方程的解的数量

x1 x2 x3 = 数字

当三个xs是介于1和10之间的正整数时。该方法还应打印出这些解,每个解在单独的行中。打印顺序无关紧要。

我试过了:

public static int solutions (int x1, int x2, int x3, int counter, int num)
{
    if(x1 > 10 || x2 > 10 || x3 > 10) {
        return 0;
    }
    if (x1 + x2 + x3 == num) {
        System.out.println(x1 + "+" + x2 + "+" + x3);
        counter = 1;
    } else {
        return solutions (x1 + 1, x2, x3, counter, num) +
               solutions (x1, x2 + 1, x3, counter, num) +
               solutions (x1, x2, x3 + 1, counter, num);
    }
    return counter;
}

public static int solutions (int num)
{
    if (num < 3 || num > 30) {
        return 0;
    }
    return solutions (1, 1, 1, 0, num);

}

问题是我重复了结果,问题是我得到了重复的结果,例如num=5,我得到:

3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
2 + 2 + 1
1 + 3 + 1
1 + 2 + 2
2 + 1 + 2
1 + 2 + 2
1 + 1 + 3

代替

1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1

怎样才能避免重复两次?

共有3个答案

勾向文
2023-03-14

这就是我想出来的…(它适用于等式中任意数量的变量)

public static int solutions(int num)
{
    return solutions(num, 3, 1, ""); // 'varsInTheEq' represents the numbers of varibelas in the equation (in this case: 'x1 + x2 + x3 = num' which is 3)
}

private static int solutions(int num, int varsInTheEq, int value, String builder)
{
    if (num == 0 && varsInTheEq == 0) // if we solved the equation
    {
        System.out.println(builder);
        return 1;
    }

    if (varsInTheEq == 0 || value > num)
        return 0;

    int r1 = solutions(num - value, varsInTheEq - 1, 1, builder + value + " ");
    int r2 = solutions(num, varsInTheEq, value + 1, builder);

    return r1 + r2;
}
越英范
2023-03-14

这绝对是您提供的代码的预期行为;第一次调用您的函数时,它将执行此操作(为了简洁起见,我删除了最后两个参数):

返回解决方案(2, 1, 1) 解决方案(1, 2, 1) 解决方案(1, 1, 2)

假设对于所有三个参数,您都加1直到得到10,您将期望(例如)2 2 1在某个时候由第一次和第二次调用生成。

解决问题的一个方法是通过递归传递某种类型的集合对象,每次找到一个集合对象时,都会向其添加解决方案。然后,当你发现一个新的,你会检查它是否包含在你的收藏中,并检查它的总数是否正确。

徐瀚
2023-03-14

以下是我的做法:

public static void main(String[] args) {
    System.out.println("Number of solutions: "+ solutions(5));
}

public static int solutions(int num) 
{
    if (num < 3 || num > 30)
        return 0;
    else
        return solutions(num, 1, 1, 1);
}

private static int solutions(int num, int x1, int x2, int x3)
{   
    int valid = 0;          
    if (x1 + x2 + x3 == num)
    {
        valid = 1;
        System.out.println(x1 + " + " + x2 + " + " + x3 + " = " + num);            
    }                
    if ((x3 < 10) && (x1 + x2 + x3 < num))
    {
        return valid + solutions(num, x1, x2, ++x3);
    }
    else if ((x2 < 10) && (x1 + x2 < num)) 
    {
        return valid + solutions(num, x1, ++x2, 1);    
    }
    else if ((x1 < 10) && (x1 < num))
    {
        return valid + solutions(num, ++x1, 1, 1);
    }  
    else
    {
        return valid;
    }
}
 类似资料:
  • 问题内容: 我有一类这样的方法: 我如何在另一个类中调用此方法? 问题答案: 1. 如果要从中调用该方法的类位于同一包中,则创建该类的实例并调用该方法。 2. 使用 3. 最好有个赞等等。 例如:

  • 本文向大家介绍JS数组返回去重后数据的方法解析,包括了JS数组返回去重后数据的方法解析的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍Spring MVC处理方法返回值过程解析,包括了Spring MVC处理方法返回值过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring MVC处理方法返回值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于Spring MVC处理方法支持支持一系列的返回方式: (1)ModelAndView

  • 问题内容: 在oracle中,我想创建一个delete sproc,该过程基于删除的结果返回一个整数。 这是我到目前为止所拥有的。 我试过将一个RETURNS INTEGER放入,但该存储过程将无法编译。 问题答案: 使用函数和隐式SQL游标确定删除的行数 那应该工作

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 考虑: 我弄不明白为什么返回的字符串值会产生不同的结果。intern(),上面写着: 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 特别是在这两次测试之后: 我曾经读过一篇帖子,其中谈到了一些在其他事情之前实习的特殊字符串,但现在真的很模