Java:在一个递归方法中查找两个正整数的最小公倍数,有2个参数,没有其他循环或方法

Java:在一个递归方法中查找两个正整数的最小公倍数,有2个参数,没有其他循环或方法,java,recursion,methods,Java,Recursion,Methods,我正试图为一个额外的学分作业编写一个递归方法,找到两个正整数的最小公倍数。然而,该方法需要遵循这些规则 该方法必须是静态的,只有两个int参数 该方法必须是递归的,并且不能使用任何循环 该方法不能调用任何其他方法,也不能调用任何重载方法 该方法返回传递给它的参数的最小公倍数 我的问题是,如果没有第三个参数,这可能吗 假设参数(a,b)已经(6,8)作为参数传递 public static int findLCM (int a, int b) { if (a % b == 0)

我正试图为一个额外的学分作业编写一个递归方法,找到两个正整数的最小公倍数。然而,该方法需要遵循这些规则

  • 该方法必须是静态的,只有两个int参数
  • 该方法必须是递归的,并且不能使用任何循环
  • 该方法不能调用任何其他方法,也不能调用任何重载方法
  • 该方法返回传递给它的参数的最小公倍数
  • 我的问题是,如果没有第三个参数,这可能吗

    假设参数(a,b)已经(6,8)作为参数传递

    public static int findLCM (int a, int b) {
        if (a % b == 0)
            return a;
        else
            return findLCM(a + a, b);
    }
    
    我想做的是将6增加到12,并使用findLCM进行递归调用(12,8),然后12将是18,最后是24。因为(24%8==0),所以24将是LCM

    但是,正如您可以清楚地看到的,这段代码并没有做到这一点,因为

    return findLCM(a + a, b);
    
    只能使用第三个参数,然后重写为

    return findLCM(a + originalA, b);
    
    我似乎找不到任何不添加第三个参数的方法

    我也尝试过其他方法,比如先得到最大公分母,然后用它来找到最小公倍数,但如果没有其他方法,或者至少是循环,这似乎是不可能的

    // Doesn't work. Attempts to get greatest common denominator first, then apply the formula to find the LCM at the first instance of the method being called
    // but there seems to be no way to really detect when to apply this final formula
    public static int findLCM (int a, int b) {
        int result;
        if (b == 0)
            return a;
        else { 
            result = findLCM(b, a % b);
            // When to return gcd, or return lcm???
            if (result == b)
                return result; 
            else
                return (a * b) / result; // formula for lcm
        }
    }
    
    我曾想过尝试素数分解,然后用它来找到lcm,但我确信这会遇到与获得gcd然后找到lcm相同的问题。没有其他方法或循环是不可能的

    如果这个问题与编码不完全相关,我深表歉意,但我只想知道是否有人看到我遗漏了什么?实际上有没有一种方法可以递归地找到lcm,只需要两个参数,而不需要循环或其他方法调用。还是我一直在绞尽脑汁什么都没有?这是一个简单的java类,我觉得它真的不应该这么难。要么任务不可能,要么我错过了一些明显的东西


    谢谢你的帮助

    嗯。。。一个相当棘手的解决方案是使用负值来告诉函数计算最大的公共支配者,然后使用其与lcm的关系:

    int public lcm(int a, int b) {
      if (a >= 0 && b >= 0) {
        long gcd = lcm(-a, -b);
        return (a * b) / gcd;   // lcm(a,b) * gcd(a,b) == |a*b|
      }
      // here we simulate euclid's gcd()
      a = -a;
      b = -b;
      if (b == 0)
        return a;
      else
        return lcm(-b, -(a%b)); // neg -> simulate gcd()
    }
    

    一个很酷的解决方案!!希望它对所有的输入都有效

    public class LCM
    { 
      static int i=1;
      public static void main(String s[])
      {
        System.out.print(lcm(112,34));
      }
    
      public static int lcm(int a,int b)
      {   
         if(a%b==0)
            return a;
         else
            return lcm(a+a/i++,b);
       }
    }
    

    这将找到最低的公社乘数和最大的公社系数

    //Get Lowest Common Multiplier
    public int LCM(int a, int b) {
        return (a * b) / GCF(a, b);
    }
    
    //Get Greatest Common Factor
    private int GCF(int a, int b) {
        if (b == 0) {
            return a;
        } else {
            return (GCF(b, a % b));
        }
    }
    

    如果你想要一个简短的版本

    “要求家庭作业帮助的问题必须包括你迄今为止为解决问题所做的工作的摘要,以及对你解决问题的困难的描述。”(其中家庭作业包括任何类型的“家庭作业”,无论是学校、工作、挑战等。)您的示例代码与您要问的问题无关。那么您在代码或数学方面有困难吗?在这种情况下,请重新表述您的问题,以便您解释您试图实现的算法,以及您在以非递归方式实现它时遇到困难的原因。事实上,这个问题根本与编码无关。你的问题的答案是“不”。但是回到我的评论,试着描述一下你的算法。你没有在任何地方描述过它(除了在你的断章取义的代码中)。然后展示为什么你认为你需要你所问的任何事情。如果我们不知道你在想什么,我们就帮不了你(我也不认为写下答案就是在帮你)。你明白我的意思吗?这篇评论你无缘无故地复制并粘贴在我所有的帖子中,请学习如何发表专业意见这里的namig公约是功能的首字母缩写,但它同样是纯技术性的,可以毫无问题地进行更改
    public static int lcm(int a, int b) {
        return (a == 0 || b == 0) ? a + b : lcm(Math.max(a, b) - Math.min(a, b), Math.min(a, b));
    }