Java 递归与乘法

Java 递归与乘法,java,recursion,multiplication,Java,Recursion,Multiplication,这可能吗,伙计们?这是我的家庭作业,我的老师显然相信,但在我看来,除了短乘法之外,不使用加法或乘法是不可能的 编写(并提供)递归算法的测试程序: 整数乘法(整数x,整数y) 将两个正整数相乘而不使用* 操作人员不要只把x加上y次 (提示:编写一个递归方法,将整数乘以 值的范围为0..10。然后将第二个递归方法写入 实现您学习的乘法算法 小学里的多位数。) 我的问题是,一旦你分解任何多位数并开始相加,你必须使用大于10的数字乘法,即22*6是2*6+20*6。。。那么我是不是完全错过了什么 编辑

这可能吗,伙计们?这是我的家庭作业,我的老师显然相信,但在我看来,除了短乘法之外,不使用加法或乘法是不可能的

编写(并提供)递归算法的测试程序:

整数乘法(整数x,整数y)

将两个正整数相乘而不使用* 操作人员不要只把x加上y次

(提示:编写一个递归方法,将整数乘以 值的范围为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次。我个人认为不是,但我的老师不是很清楚,我想知道是否有其他我没有想到的方法,抱歉搞混了。

是的,有可能。是的,我想你遗漏了什么。试着写下你在手动乘法两个数字时要遵循的步骤,就像你在小学时学的那样

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

很容易做到

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

上面没有考虑到y为负值的情况,但是你不希望我为你做所有的工作

你当然能做到

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

所以。。如果x为零或y为零,则返回0

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

因此,您将有如下内容:

x + multiply(x, y - 1);

<>你必须考虑一个数字是否定的(但是如果你理解基本的,我相信你可以很容易地做到)。 例如,将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);
}
公共整数乘法(整数x,整数y)
{
如果(x<0)抛出新的ArgumentException(“必须是正整数”,“x”);
如果(y<0)抛出新的ArgumentException(“必须是正整数”,“y”);
如果(x==0 | | y==0)返回0;//明显的快速退出条件
//整数除法
int xDivBy10=x/10;
int yDivBy10=y/10;
布尔单位数=xDivBy10==0;
bool-yisingledigital=yDivBy10==0;
//基本情况
if(xisingledigital&&yisingledigital)
{
返回多个单位数(x,y);
}
//否则,递归使用网格乘法
// http://en.wikipedia.org/wiki/Grid_method_multiplication
if(xissisingledigital)//y不能是一位数字
{
返回(乘(x,yDivBy10)*10)+乘(x,y%10);
}
if(yissingledigital)//x不能是一位数字
{
返回(乘(xDivBy10,y)*10)+乘(x%10,y);
}
//else-x和y都是不是个位数的数字
return(乘(x,yDivBy10)*10)+乘(x,y%10);//与“if(singledigital)”大小写相同的代码
}
//从技术上讲,该算法可以将任何正整数相乘
//但根据作业要求/提示,我已将其限制为仅个位数
专用整数倍单位数(整数x,整数y)
{
如果(x<0 | | x>9)抛出新的ArgumentException(“必须在0-9范围内(包含)”,“x”);
如果(y<0 | | y>9)抛出新的ArgumentException(“必须在0-9范围内(包含)”,“y”);
如果(x==0 | | y==0)返回0;//基本大小写
返回x+多个单位数(x,y-1);
}
注意事项:

  • 这种方法仍然使用
    *
    运算符,但不用于实际乘以
    x
    y
    ,而是用于将其他子产品乘以10
  • 这段代码的许多部分都可以简化/重构,但我特意对它们进行了扩展,以使步骤更加明显

当y>=0和y
静态整数乘法(整数x,整数y)时,此解决方案都适用
{
如果(y>0&&x>0)
返回(x+乘(x,y-1));
如果(y<0&&x>0)
返回-乘法(x,-y);
如果(x<0&&y>0)
返回-乘法(-x,y);
if(x<0&&y<0)
返回乘法(-x,-y);
返回0;
}

这很有可能。你尝试过什么?如果讲师有不同的解决方案,请更新这个,然后是给定的递归函数。我会的,这将需要几天时间,因为它实际上直到今晚才到期。仍然没有得到答案,以防万一有人想知道这不是“不只是将x添加到自身y次”我假设指令指的是for循环。是的,这是我的问题,我原以为他指的是不要迭代,但现在我不是这样了sure@Connor你问过他吗?是的,全班都在讨论这个问题…我的解释是,他指的是,即使递归版本也只是添加x+xy次,但现在我想起来了,可能只是关于迭代……类有点吵。无论如何,除非有人有其他想法,否则我只想说这就是答案。这不是“不只是把x加上y次”?我相信他是在告诉他不要使用循环。这就是我的意思,但我仍然不明白这有什么不同,对吗
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;
}
    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;
    }