假设我有一个抽象方法,它接受并返回long值,如下所示:
public abstract long func(final long value);
该方法将由任何继承此类的人实现,但所使用的算法将具有以下限制:
此外,该算法可能相当复杂,并且可能随着时间的推移而变化(因为编写了新版本的软件)。我想使实现者不必编写反函数,特别是考虑到由于复杂性,它是潜在的错误来源。假设速度不是一个因素。所以我想创建一个生成前一个方法的逆的方法。不知道使用的算法,我看到的唯一方法是重复调用 func 方法,直到我得到所需的结果。这是未经测试的代码,写在我的头顶:
public long inverseFunc(final long value) {
// Assume I can make an educated guess about expected result
long expectedResult = makeEducatedGuess();
long prevResult = 0L;
while (true) {
long newResult = expectedResult - ((expectedResult - prevResult) / 2);
long intermediateValue = func(newResult);
if (intermediateValue == value)
return newResult;
prevResult = expectedResult;
expectedResult = newResult;
}
}
实现此功能的最佳方法是什么?在这种情况下,我只是简单地将最新结果和之前结果之间的差异拆分为两个,但也许有一种方法可以更聪明地使用它。
修改
这是一种简单且运行良好的算法。我首先将预期结果设置为doubled值,这是我的场景中最常见的情况。您可以将其设置为适合您目的的任何内容。
public long inverseFunc(final long value) {
long expectedResult = value * 2;
while (true) {
long intermediateValue = func(expectedResult);
long diff = intermediateValue - value;
if (diff == 0L)
return expectedResult;
expectedResult -= diff;
}
}