2014-11-08 3 views
1

Я понимаю ошибку прямого ссылки, но почему мне нужно пройти следующее: Определить 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

+0

Жаль об этом. Вопрос в том, почему различные фрагменты комментируемого кода не работают. Например, я не могу определить lambda factorial_lambda локально в рекурсии(). – Jerrolds

ответ

1
  1. Первая ошибка: "самореференция в инициализаторе". Сообщение об ошибке здесь довольно ясно. Нельзя ссылаться на переменную в ее инициализаторе.
  2. Эта строка не является основанием для ошибки вообще. Это абсолютно корректно и фактически успешно компилируется. Причина этой ошибки заключается в том, что ваша переменная factorial_lambda (в незакомментированном фрагменте кода) перестает быть окончательной. И он используется внутри тела выражения лямбда. Но внутри тела выражения лямбда допускаются только конечные или эффективные конечные локальные переменные.
  3. Здесь используется необработанный тип. Вот почему выведенный тип i - это Object, а не Integer. Сравнение его с 1 с использованием оператора ==, очевидно, является ошибкой компиляции. Так что вычитает из него 1. Я бы рекомендовал избегать необработанных типов, когда это возможно.
+0

Спасибо, что очень полезно. Единственная проблема, с которой я все еще сталкиваюсь, - это 3. Когда функция Iput factorial_lambda2 = (i) -> { if (i == 1) return 1; else return i * (factorial_lambda2.apply (i-1)); }; В теле рекурсии я получаю ошибку: переменная factorial_lambda2, возможно, не была инициализирована. – Jerrolds

+0

@Jerrolds Что совсем неясно о 3.? – kraskevich

+0

Я не уверен, есть ли полный ответ. Если это не так, когда я положил Function factorial_lambda2 = (i) -> { if (i == 1) return 1; else return i * (factorial_lambda2.apply (i-1)); }; В теле рекурсии я получаю ошибку: переменная factorial_lambda2, возможно, не была инициализирована. – Jerrolds

Смежные вопросы