Я не думаю, что это можно сделать разумным и всеобъемлющим образом.
Возможно, вы захотите повторно оценить свою проблему. Я полагаю, что ваша функция «не работает» с рекурсивными функциями, поскольку она только запоминает первый вызов, и все рекурсивные вызовы переходят к не memoized функции? В зависимости от вашего сценария это может быть плохо.
Memoization торгует памятью для скорости. В большой системе вы можете не захотеть оплачивать затраты на замещение промежуточных результатов, если вы заботитесь только о последнем. Все эти словари складываются со временем.
Если вы, тем не менее, особенно заботитесь о мнимом рекурсивной функции, вы можете явно структурировать его таким образом, чтобы придать себя мемуаризации. См. linkedthreads.
Таким образом, я бы ответил, что функция memoize не должна касаться рекурсии вообще. Если пользователь хочет запоминать рекурсивную функцию, ему приходится понимать связанные с этим компромиссы и структурировать функцию таким образом, чтобы промежуточные вызовы могли быть замечены , если это то, что он требует.
Что такое «произвольная рекурсивная функция»? Можете ли вы привести примеры кода того, о чем вы спрашиваете? – CoderDennis