这可能吗?这是我的作业,我的老师显然相信它,但在我看来,不可能不使用短乘法之外的加法或乘法。
写入(并提供测试器)递归算法:
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次。我个人认为不是,但我的老师不是很清楚,我想知道是否还有其他一些我没有想到的方法,对不起这种困惑。
答案 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);
}
备注:强>
*
运算符,但不实际乘以x
和y
,它用于将其他子产品增加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;
}