2014-11-08 68 views
1

我的理解前向引用錯誤,但爲什麼我必須通過以下內容去 define n! ? 我已經註釋掉了錯誤,並添加了我看到的編譯器錯誤。Java 1.8遞歸lambdas

import java.util.function.Function; 

class Recursion { 
    Function<Integer, Integer> factorial_lambda = null; 

    int factorial_imp(int i) { 
     if (i == 1) 
      return 1; 
     else 
      return i * factorial_imp(i - 1); 
    } 

    /* 
    Function<Integer, Integer> factorial_lambda = (i) -> { 
     if (i == 1)   
      return 1; 
     else  
      return i * (factorial_lambda.apply(i - 1)); 
      // error: self-reference in initializer 
    }; 
    */ 

    public static void main(String[] args) { new Recursion(); } 

    public Recursion() { 
     /* 
     Function<Integer, Integer> factorial_lambda = (i) -> { return 1; }; 
     // variable used in lambda expression should be final 
     // or effectively final; 

     // Function factorial_lambda = (i) -> { ... 
     //error: imcomparable types: Object and int if (i == 1) 
     //error: bad operand types for binary operator '-' apply(i - 1) 
     */ 
     factorial_lambda = (i) -> { 
      if (i == 1) 
       return 1; 
      else 
       return i * (factorial_lambda.apply(i - 1)); 
     }; 

     System.out.println(factorial_imp(5)); 
     System.out.println(factorial_lambda.apply(5)); 
    } 
} 
+0

它爲我編譯和正常工作。你使用什麼編譯器? – kraskevich 2014-11-08 18:34:31

+0

對不起。問題是爲什麼各種評論代碼片段不起作用。例如,我無法在遞歸()中本地定義lambda factorial_lambda。 – Jerrolds 2014-11-08 19:47:02

回答

1
  1. 第一錯誤: 「在初始化自參考」。這裏的錯誤信息很清楚。不允許在其初始化器中引用變量。
  2. 這條線不是一個錯誤的原因。這是絕對有效的,它實際上編譯成功。這個錯誤的原因是你重新指派factorial_lambda變量(在沒有註釋掉的一段代碼中),所以它停止了有效的最終決定。它在lambda表達式體內使用。但是在lambda表達式體內只允許最終或有效的局部變量。
  3. 您在這裏使用原始類型。這就是爲什麼i的推測類型是Object,而不是Integer。使用==運算符與1比較它顯然是一個編譯錯誤。所以從它減去1。我會建議儘可能避免原始類型。
+0

非常感謝您的幫助。當Iput Function factorial_lambda2 =(i) - > {if == 1} return 1時,我仍然有唯一的問題。 else return i *(factorial_lambda2.apply(i-1)); };在遞歸正文中,我收到錯誤:變量factorial_lambda2可能未被初始化。 – Jerrolds 2014-11-08 21:08:38

+0

@Jerrolds什麼ecaxtly不清楚約3? – kraskevich 2014-11-08 21:11:07

+0

我不確定是否有完整的答覆。如果不是,則當我將Function factorial_lambda2 =(i) - > {if == 1} return 1; else return i *(factorial_lambda2.apply(i-1)); };在遞歸的主體中,我得到錯誤:變量factorial_lambda2可能沒有被初始化。 – Jerrolds 2014-11-08 21:16:07