Я пытался умножить два целых числа с использованием рекурсии и случайно написал этот код:
//the original version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, b ? --b : ++b ); //accident
}
Я сказал, я написал это случайно, потому что я намеревался написать:
b > 0 ? --b : ++b
вместо b ? --b : ++b
Я понимаю, что то, что я намеревался написать не будет работать. Но для меня это удивительно, что я сделал не намереваться писать работает.
Теперь я отмечаю, что b ?--b : ++b
в основном эквивалентен --b
, потому что b
в else-блоке гарантированно будет отличным от нуля. Поэтому я изменил приведенный выше код, заменив b?--b:++b
на --b
, как показано ниже:
//the modified version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, --b); //modification here
}
Поскольку исходная версия woks, я ожидал, что модифицированная версия также будет работать. Но опять же, к моему удивлению, не работает!
- Что случилось с измененной версией?
- Разве это не эквивалентно исходной версии?
-
--b
не эквивалентенb ?--b : ++b
IFb
отличен от нуля? Если его эквивалент, то почему первый код работает, а второй - нет?
Примечание: здесь, под "работой", я имею в виду, что он дает правильный результат. То есть, это дает умножение целых чисел, переданных функции.