Ваша проблема с x % 3
, что будет, если x = 5
? вы пропустите это. Вот улучшенная версия вашего кода.
int multiply(int x, int y) {
if (x == 0)
return 0;
else if (x % 2 == 1)
return (multiply(x >> 1, y << 1) + y);
return multiply(x >> 1, y << 1);
}
или, может быть, даже это:
int multiply(int x, int y) {
if (x == 0)
return 0;
int m = multiply(x >> 1, y << 1);
if (x % 2 == 1)
m += y;
return m;
}
Вот супербыстрая версия, предложенная Энди:
int multiply(int x, int y) {
if (x == 0)
return 0;
int m = multiply(x >> 1, y << 1);
if (x & 1)
m += y;
return m;
}
В качестве проблемы скорости, вот нерекурсивная версия:
int multiply (int x, int y) {
int y1 = 0;
for (; x > 0; x = (x >> 1), y = (y << 1))
if (x&1)
y1 += y;
return y1;
}
ПРИМЕЧАНИЕ. Я знаю, что этот вопрос касается рекурсивного метода, но в качестве проблемы я написал нерекурсивный алгоритм.