이유는 무엇입니까 내 빠른 지수 알고리즘을주고 나에게 람다의 매개 변수에 '기호를 찾을 수 없습니다'오류?

Jodast :

배경 / 목표는 내가 달성하기 위해 노력하고 있습니다 :

나는 (연습으로) 처음부터 자바 빠른 지수 알고리즘을 구현하는 시도하고있다. (johndcook.com에서 가져온 설명은) 다음과 같은 알고리즘은 다음과 같습니다

입력 : 기재 B , 지수 N .

이진 지수 N를 작성합니다. 왼쪽에서 두 번째 비트부터 시작하여, 왼쪽에서 오른쪽으로 이진 표현을 읽어보십시오. 수 A를 시작, 당신이있어 평방 무엇 0 비트를 읽을 때마다. 때마다 당신은 광장이과 곱셈에 의해 무엇을 가지고 1 비트를 읽어 보시기 바랍니다. 2 개은 log2 (n)에 승산보다 더 이용하여 계산 될 수 없음을 따른다.

나는이 알고리즘을 구현하는 더 나은 방법을 찾고 있지 않다, 오히려 내가 왜이 특정 오류를 얻고있다.

어떤 문제가

나는 자바에 재귀 람다를 사용하여이 알고리즘을 구현하기 위해 노력하고, 내가 프로그램을 실행 갔을 때, 나는 다음과 같은 오류를 가지고 :

Main.java:11 : 오류 : 기호를 찾을 수 없습니다

exponentiator = (int runningResult, int binLength, int binInt, int expBase) -> {
                                                               ^

Main.java:11 : 오류 : 람다 식 여기에 예상하지

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);
  }
}

https://repl.it/@Jodastt/Fast-Exponentiation

스위퍼 :

당신은 하나의 큰 문제는 람다 유형을하지 않는다는 것입니다. 당신은 하나를 제공해야합니다. 나는 어떤 종류의 인식하지 오전 java.util.function당신은 아마 이런 종류의 직접 선언 할 필요가 있으므로, 4 개 매개 변수를 복용하는 함수를 표현 할 수 있습니다.

다른 주요 문제는 변수를 사용하는 것입니다 exponentiator무효 선언, 내부. 이 문제를 해결하려면, 당신은 람다 자체가 통과 될하는 람다에 다섯 번째 매개 변수를 추가해야합니다. 그런 다음이 매개 변수에 대한 호출로 재귀 호출을 대체합니다.

하자 먼저이 람다를 나타내는 유형을 선언합니다.

interface IntQuadRecursiveFunction {
    int apply(int a, int b, int c, int d, IntQuadRecursiveFunction f);
}

그리고 다음 exponentiator과 같이 다시 선언 할 수있다 :

// note the type and extra parameter "f"
IntQuadRecursiveFunction exponentiator = (runningResult, binLength, binInt, expBase, f) -> {
   int firstDigit = Integer.parseInt(Integer.toString(binInt).substring(1, 2));
   if (binLength == 0) { // It's "==", not "="
       return runningResult;
   } else if (firstDigit == 0) {
        // note the word "return", which you were missing
        // also the extra argument "f"
       return f.apply((runningResult * runningResult), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase, f);
   } else {
       // should be "expBase", not "base"
       return f.apply((runningResult * runningResult * expBase), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase, f);
   }
};

용법:

// you are missing a return in "fastExp" as well
return exponentiator.apply(b, length, nBinInt, b, exponentiator); // note the last argument

내가 당신이라면 솔직히 말해서, 난 그냥이 모든 문제를 저장하고 대신 통상의 방법을 작성합니다 :

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();
    return exponentiator(b, length, nBinInt, b);
}

private static int 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) {
        return exponentiator((runningResult * runningResult), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase);
    } else {
        return exponentiator((runningResult * runningResult * expBase), (binLength - 1), (binInt % (int) Math.pow(10, (int) Math.log10(binInt))), expBase);
    }
}

추천

출처http://43.154.161.224:23101/article/api/json?id=333708&siteId=1