Как реализовать рекурсивную функцию с двумя входами, используя лямбда-выражения? - PullRequest
0 голосов
/ 11 июля 2020

Я пытался реализовать рекурсию с помощью лямбда-функции в java -8. Имея документацию и ресурсы, найденные в Интернете, я могу выполнить рекурсивный вызов с одним параметром в функции.

См. Фрагмент кода ниже -

    private static final IntToLongFunction fact = x  -> x == 0 ? 1L : x*MyTestClass.fact.applyAsLong(x-1);

    public static void main(String[] args) {
           System.out.println(fact.applyAsLong(4));
    }

Теперь я пытаюсь получить что-то похожее на приведенный выше фрагмент кода для следующего варианта использования, когда я пытаюсь узнать gcd двух чисел -

// Normal recusive meethod for finding gcd
    private static long gcd(long a, long b){
        return b == 0 ? a : gcd(b, a%b);
    }

Я попытался использовать интерфейс функции для этого, но не повезло с ним.

Функция gcd = (Длинный a, Длинный b) -> b == 0? a: this.gcd.apply (b);

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 11 июля 2020

Я думаю, вы хотите создать функцию, которая принимает два Long аргумента и возвращает Long.

A Function <Long, Long> - это функция, которая принимает один Long аргумент и возвращает Long. Значит, функциональный интерфейс не подходит для ваших целей. Вместо этого, я думаю, вам нужен BiFunction<Long, Long, Long>. Или для краткости вы можете использовать BinaryOperator<Long>, чтобы обозначать то же самое.

A BiFunction is, из документации:

Представляет функцию, которая принимает два аргумента и выдает результат .

И BinaryOperator:

Представляет операцию над двумя операндами одного и того же типа, производя результат того же типа, что и операнды. Это специализация BiFunction для случая, когда операнды и результат имеют один и тот же тип.

Также, если вы хотите, чтобы ваша функция принимала два аргумента, вам необходимо передать два аргумента на this.gcd.apply(). Тогда вы должны быть настроены.

Ссылки

...