由于乘法是简单的重复加法,如果y
是成对,则可以将它除以2,然后将x
乘以2。 (所以,2 * 2 = 2 + 2.2 * 3 = 2 + 2 + 2,2 * 4 = 2 + 2 + 2 + 2 ....)
如果y
是奇数,则可以减1得到一对y
,你需要添加一个x
(基本上是1 * y)。
这里有一个细目:
RecMultiply(5,5) :
+- z = RecMultiply(5,2)
| return 5 + 2 * z (=20 +5 =25)
|
|
+-- RecMultiply(5,2) :
+- z = RecMultiply(5,1)
| return 2 * z (=10)
|
+-- RecMultiply(5,1) :
+- z = RecMultiply(5,0)
| return 5 + 0
|
+---RecMultiply(5,0) :
return 0
RecMultiply(5,4) :
+- z = RecMultiply(5,2)
| return 2 * z (=)
|
+-- RecMultiply(5,2) :
+- z = RecMultiply(5,1)
| return 2 * z (=10)
|
+-- RecMultiply(5,1) :
+- z = RecMultiply(5,0)
| return 5 + 0
|
+---RecMultiply(5,0) :
return 0
所以,基本上,递归位后(即通吃对乘法护理),你可能需要添加另一个y
,其在上述第一种情况,是第一次通话为5
)。
请注意y=1
的特殊情况,意思是x*1
,在我们的例子中显然是5
。同样的逻辑适用。
你可能想看看它这个样子,如果它可以帮助:
static int RecMultiply(int x, int y)
{
switch (y)
{
case 0:
return 0;
break;
case 1:
return x;
break;
default:
return (y%2 ==0) ? RecMultiply(x, y/2)
: x + RecMultiply(x, y/2);
break;
}
}
我认为这表示在更容易理解的方式+1(或奇数的情况下)。
我很抱歉。我已经更新了答案。这是X不是Z。 –
我想我的下一个问题是x,y和z代表书本中与列和运行总数的关系? – reggaeguitar
除非您需要关注本书,否则我会说忘记。尝试理解逻辑。 X和y是我们需要计算的产品的两个数字。 Z是过程中使用的临时值。 –