【发布时间】:2019-09-27 05:51:59
【问题描述】:
我正在努力实现的背景/目标:
我正在尝试从头开始在 Java 中实现快速求幂算法(作为实践)。算法如下(解释取自johndcook.com):
输入:底数b,指数n。
将指数 n 写成二进制。从左数第二位开始,从左到右读取二进制表示。从数字 a 开始,每次读取 0 位时,求平方。每次读取 1 位时,将所得到的平方并乘以 a。因此,可以使用不超过 2 个 log2(n) 乘法来计算 an。
我不是在寻找更好的方法来实现这个算法,而是为什么我会得到这个特定的错误。
问题是什么
我尝试在Java中使用递归lambda来实现这个算法,当我去运行程序时,我得到了以下错误:
Main.java:11: 错误:找不到符号
exponentiator = (int runningResult, int binLength, int binInt, int expBase) -> { ^Main.java:11: 错误:这里不需要 lambda 表达式
exponentiator = (int runningResult, int binLength, int binInt, int expBase) -> { ^Main.java:23: 错误:找不到符号
exponentiator(b, length, nBinInt, b); ^
我无法解释这些错误,谁能帮帮我?
代码:
class Main {
public static void main(String[] args) {
fastExp(2, 13);
}
//This is the algorithm itself
public static int fastExp(int b, int n) {
//converts n (b^n) to binary for algorithm
String nBinStr = Integer.toBinaryString(n);
int nBinInt = Integer.parseInt(nBinStr);
int length = String.valueOf(nBinInt).length();
exponentiator = (int runningResult, int binLength, int binInt, int expBase) -> {
int firstDigit = Integer.parseInt(Integer.toString(binInt).substring(1, 2));
if(binLength = 0){
return runningResult;
}
else if(firstDigit = 0){
exponentiator((runningResult * runningResult), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase);
}
else {
exponentiator((runningResult * runningResult * base), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase);
}
};
exponentiator(b, length, nBinInt, b);
}
}
【问题讨论】:
-
Labdas 无法引用自己。
-
使用常规方法即可。
-
将 lambda 作为参数传递。
-
作为 lambda 的参数。
-
在 Java 中没有没有类型的内联 lambda。 Java 不是 JavaScript。在 Java 中,您需要像
Function<Integer, Integer> f = x -> x + 1;这样的东西,一旦您拥有 Function类型的变量,您将使用 Integer b = f.apply(42);调用。
标签: java algorithm lambda parameters compiler-errors