То, что вы имеете в виду, называется памятка : чистая функция (то есть функция, возвращаемое значение которой зависит только от значений аргумента) может запомнить результат для аргументов, с которыми она сталкивалась ранее.
Мемоизация выполняется некоторыми высокоуровневыми специализированными языками, такими как Maple. Однако языки общего назначения по умолчанию не имеют такого (довольно сложного) поведения.
Однако в вашем случае это не обязательно. Вместо использования рекурсии ваш алгоритм лучше реализован как итерация . Двоичное возведение в степень путем многократного возведения в квадрат является стандартным алгоритмом.
Вот некоторый C-подобный псевдокод (мой Java не на 100%):
// compute pow(base, exponent)
int result = 1;
int term = base;
while (exponent != 0)
{
if (exponent % 2 != 0) { result *= term; }
term = term * term;
exponent /= 2;
}
return result;
В некоторых примерах 7 равно 111 в двоичном виде, поэтому b 7 = b 1 & times; b 2 & times; b 4 , и нам нужно только отслеживать одну копию текущего термина. Еще один: 5 = 101b, поэтому b 5 = b 1 & times; 1 & раз; б 4 .
В C ++ довольно просто создать универсальную оболочку для заметок для любой функции R f(T1, T2, ..., TN)
, которая хранит память в хэш-карте std::unordered_map<std::tuple<T1, ..., TN>, R>
; при вызове обертка проверяет, существует ли уже аргумент-кортеж, и если да, возвращает значение из карты, а если нет, выполняет вычисление и вставляет результат в карту. Я уверен, что нечто подобное может быть установлено в Java.