递归和乘法

时间:2013-04-17 19:33:05

标签: java recursion multiplication

这可能吗?这是我的作业,我的老师显然相信它,但在我看来,不可能不使用短乘法之外的加法或乘法。

  

写入(并提供测试器)递归算法:

     

int multiply(int x,int y)

     

将两个正整数相乘而不使用*   运营商。不要只为自己添加x次!

     

(提示:编写一个将整数乘以a的递归方法   值的范围为0 .. 10.然后写第二个递归方法   实现你学会乘法的乘法算法   小学里的多位数字。)

我的问题是,一旦你打破任何多位数并开始将它们加在一起你必须使用大于10的数字乘法,即22 * 6是2 * 6 + 20 * 6 ...所以我完全遗失了什么?

修改 我想我应该补充一下这是我的代码,

public int mult(int x, int y){
return x == 0 ? 0 : (mult(x-1, y) + y);
}

这是完美的,但就我理解的说明而言,破坏不只是将x添加到自身y次。我个人认为不是,但我的老师不是很清楚,我想知道是否还有其他一些我没有想到的方法,对不起这种困惑。

6 个答案:

答案 0 :(得分:5)

是的,这是可能的。是的,我想你错过了一些东西。尝试写下你要遵循的步骤,手动将两个数字相乘,就像你在小学里学到的那样。

然后将这些步骤转换为代码。

答案 1 :(得分:2)

我对作业的解释是,老师希望学生实施递归算法来执行Grid method multiplication(我们在小学学习的那种)。

例如,乘以34 x 13就像这样......

  34
* 13
====
  12
  90
  40
+300
====
 442

我没有轻松访问Java开发环境,因此我用C#编写了代码,但算法应该足够简单,可以转换为Java。

public int Multiply(int x, int y)
{
    if (x < 0) throw new ArgumentException("must be positive integer", "x");
    if (y < 0) throw new ArgumentException("must be positive integer", "y");

    if (x == 0 || y == 0) return 0; // obvious quick-exit condition

    // integer division
    int xDivBy10 = x / 10;
    int yDivBy10 = y / 10;

    bool xIsSingleDigit = xDivBy10 == 0;
    bool yIsSingleDigit = yDivBy10 == 0;

    // base case
    if (xIsSingleDigit && yIsSingleDigit)
    {
        return MultiplySingleDigits(x, y);
    }

    // otherwise, use grid multiplication recursively
    // http://en.wikipedia.org/wiki/Grid_method_multiplication

    if (xIsSingleDigit) // y must not be a single digit
    {
        return (Multiply(x, yDivBy10) * 10) + Multiply(x, y % 10);
    }

    if (yIsSingleDigit) // x must not be a single digit
    {
        return (Multiply(xDivBy10, y) * 10) + Multiply(x % 10, y);
    }

    // else - x and y are both numbers which are not single digits
    return (Multiply(x, yDivBy10) * 10) + Multiply(x, y % 10); // the same code as the "if (xIsSingleDigit)" case
}

// technically, this algorith can multiply any positive integers
// but I have restricted it to only single digits as per the assignment's requirements/hint
private int MultiplySingleDigits(int x, int y)
{
    if (x < 0 || x > 9) throw new ArgumentException("must be in range 0 - 9 (inclusive)", "x");
    if (y < 0 || y > 9) throw new ArgumentException("must be in range 0 - 9 (inclusive)", "y");

    if (x == 0 || y == 0) return 0; // base case
    return x + MultiplySingleDigits(x, y - 1);
}

备注:

  • 此方法仍然使用*运算符,但不实际乘以xy,它用于将其他子产品增加10的倍数
  • 此代码的许多部分可以简化/重构,但我特别将它们扩展为使步骤更加明显

答案 2 :(得分:1)

当然你可以做到。

首先,考虑一下情况。如果某个数字是0,那么结果是?对..零。

所以..你将if x is zero or y is zero return 0

现在..说X * Y就像说“X,Y次”,就像写作:X + .... + X(Y次)。

所以,你会有类似的东西:

x + multiply(x, y - 1);

你必须考虑其中一个数字为负数的情况(但如果你理解基本数字,我相信你可以很容易地做到这一点。)

答案 3 :(得分:0)

很容易。

int multiply(int x, int y) {
    if(y == 0) {
        return 0;
    }
    return x + multiply(x, y - 1);
}

上述情况未考虑到y为负数的情况,但您不希望我为您完成所有工作。 。

答案 4 :(得分:0)

当y> = 0且y <0

时,此解决方案将适用于两者
public int multiply(final int x, final int y) {
    if (y != 0 && x != 0) {
        if (y > 0) {
            return multiply(x, y - 1) + x;
        } else {
            return multiply(x, y + 1) - x;
        }
    }
    return 0;
}

答案 5 :(得分:0)

    static int Multiply(int x, int y)
    {
        if (y > 0 && x > 0)
            return (x + Multiply(x, y - 1));
        if (y < 0 && x > 0)
            return -Multiply(x, -y);
        if (x < 0 && y > 0)
            return -Multiply(-x, y);
        if (x < 0 && y < 0)
            return Multiply(-x, -y);

        return 0;
    }