Java 递归与乘法
这可能吗,伙计们?这是我的家庭作业,我的老师显然相信,但在我看来,除了短乘法之外,不使用加法或乘法是不可能的 编写(并提供)递归算法的测试程序: 整数乘法(整数x,整数y) 将两个正整数相乘而不使用* 操作人员不要只把x加上y次 (提示:编写一个递归方法,将整数乘以 值的范围为0..10。然后将第二个递归方法写入 实现您学习的乘法算法 小学里的多位数。) 我的问题是,一旦你分解任何多位数并开始相加,你必须使用大于10的数字乘法,即22*6是2*6+20*6。。。那么我是不是完全错过了什么 编辑 我想我应该加上这是我的代码Java 递归与乘法,java,recursion,multiplication,Java,Recursion,Multiplication,这可能吗,伙计们?这是我的家庭作业,我的老师显然相信,但在我看来,除了短乘法之外,不使用加法或乘法是不可能的 编写(并提供)递归算法的测试程序: 整数乘法(整数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
,而是用于将其他子产品乘以10y
- 这段代码的许多部分都可以简化/重构,但我特意对它们进行了扩展,以使步骤更加明显
静态整数乘法(整数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;
}