Java中的通用反函数

时间:2014-03-17 07:54:16

标签: java

假设我有一个抽象方法,它接受并返回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;
    }
}

0 个答案:

没有答案