powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия
25 сообщений из 66, страница 1 из 3
Функциональный подход Рекурсия
    #38821056
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане.

Функция по вычислению факториала на языке F# выглядит так:
Код: c#
1.
2.
3.
let rec fact x = 
if x = 1 then 1
else x*fact(x-1)



Как записать такую функцию на Java 8?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821061
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С массой ограничений, но всё же:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Recursion {
    static UnaryOperator<Integer> factorial;

    public static void main(String[] args) {
        factorial = x -> (x == 0) ? 1 : (x * factorial.apply(i - 1));
        System.out.println(factorial.apply(10));
    }
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821064
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из интересного. Лямбда не может ссылаться сама на себя.

JLS The transparency of this (both explicit and implicit) in the body of a lambda expression - that is, treating it the same as in the surrounding context - allows more flexibility for implementations, and prevents the meaning of unqualified names in the body from being dependent on overload resolution.

Practically speaking, it is unusual for a lambda expression to need to talk about itself (either to call itself recursively or to invoke its other methods), while it is more common to want to use names to refer to things in the enclosing class that would otherwise be shadowed (this, toString()). If it is necessary for a lambda expression to refer to itself (as if via this), a method reference or an anonymous inner class should be used instead .
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821066
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapvДобрый день, уважаемые форумчане.

Функция по вычислению факториала на языке F# выглядит так:
Код: c#
1.
2.
3.
let rec fact x = 
if x = 1 then 1
else x*fact(x-1)



Как записать такую функцию на Java 8?

Да на любой версии.
Код: sql
1.
2.
3.
4.
5.
6.
  public long fact(int x) {
    if (x == 1)
      return 1;
    else
      return x * fact(x-1); 
  }



Я уж не помню, заменит ли JDK8 реально этот код а более быстрый

Код: sql
1.
2.
3.
4.
5.
6.
  public long fact(int x) {
    long result = 1;
    for (int i=2; i<=x; i++)
       result *= i;
    return result;
  }
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821071
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821074
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, имеется в виду не просто рекурсия, а как математическое определение факториала, которые позволяют функциональные языки - лямбда-выражения.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821079
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapvBlazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?
Через Stream API
https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
Java не функциональный язык.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821082
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

спасибо, теперь есть с чего начать :)
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821111
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я правильно понимаю что для человека знающего java и желающего развития, получается лучше изучить java8 чем scala? Это же ему ближе и возможности получается что такие-же?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821115
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapvА я правильно понимаю что для человека знающего java и желающего развития, получается лучше изучить java8 чем scala? Это же ему ближе и возможности получается что такие-же?
Ну, одно другому не мешает. Java 8 - просто и понятно. Но Scala вобрала в себя все возможности функционального мира. Поэтому для расширения кругозора лучше такие осваивать именно её.
На developerWorks хорошая серия статей с примерыми на разных функциональных языках для JVM
http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=functional thinking:
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821122
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapvBlazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?

В данном случае функциональный стиль не даёт никаких преимуществ. Факториал- крайне плохой пример рекурсии. Просто в чисто функциональных языках иначе выходит криво- переменных-то там нет :D
А компилятор потом мучается, обрабатывая хвостовую рекурсию.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821284
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу факториала - тут не так все просто - есть понятие хвостовой рекурсии , очень хорошо пример написания факториала - и объяснение как его не надо писать и как надо - описан в языке Хаскель .

что то похожее на это но с объяснением :

http://www.willamette.edu/~fruehr/haskell/evolution.html

Для java есть что то подобное : http://habrahabr.ru/post/113128/
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821286
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
private UnaryOperator<Integer> fact(){
  final UnaryOperator<Integer> f[] = new UnaryOperator[1];
  return (f[0] = x -> (x > 0 ? x * f[0].apply(x - 1) : 1);)
}

....

fact().apply(5) // -> 120
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821533
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczС массой ограничений, но всё же:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Recursion {
    static UnaryOperator<Integer> factorial;

    public static void main(String[] args) {
        factorial = x -> (x == 0) ? 1 : (x * factorial.apply(i - 1));
        System.out.println(factorial.apply(10));
    }
}

BlazkowiczИз интересного. Лямбда не может ссылаться сама на себя.

Можно без боксинга, не определяя своих fi.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
package testintfn;

import java.util.function.IntUnaryOperator;

import static java.lang.System.out;

public class Recursion {

    static IntUnaryOperator fact() {
        return x -> x == 0 ? 1 : x * fact().applyAsInt(x - 1);
    }

    public static void main(String[] args) {
        out.println(
                fact().applyAsInt(10)
        );

        out.println();
        for (int i = 0; i < 5; ++i) {
            out.println(
                    "fact hashCode: " + fact().hashCode() + " ;)"
            );
        }
    }
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821537
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mkМожно без боксинга, не определяя своих fi.
Только проблему переполнения инта и стека это не решает ни разу.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821615
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkТолько проблему переполнения инта и стека это не решает ни разу.+100500
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821643
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без рекурсии:
Код: java
1.
2.
3.
4.
5.
6.
7.
java.util.function.Function<Integer, Double> fact = (Integer n) -> {
    return Math.ceil(Math.pow(Math.E, IntStream.range(2, n + 1).mapToDouble(i -> { 
        return Math.log(i);
    }).sum()));
};

System.out.println(fact.apply(10));
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkavp.mkМожно без боксинга, не определяя своих fi.
Только проблему переполнения инта и стека это не решает ни разу.
По теме функционального подхода. (Не по Java8!).

По поводу инта. Посмотри внимательно на самый первый исходник на F#.
Код: c#
1.
2.
3.
let rec fact x = 
if x = 1 then 1
else x*fact(x-1)


Видишь декларацию типа? Ее нет.

По поводу стека - почитай про https://ru.wikipedia.org/wiki/Хвостовая_рекурсия
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821709
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton По поводу инта. Посмотри внимательно на самый первый исходник на F#.
Код: c#
1.
2.
3.
let rec fact x = 
if x = 1 then 1
else x*fact(x-1)


Видишь декларацию типа? Ее нет.

Вывод типов в Java забанили 10 лет назад:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4459053
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821729
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех. Яже пишу выше. Не по Java.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38821999
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleapvКак записать такую функцию на Java 8?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
package streamfactorial;

import java.math.BigInteger;
import java.util.stream.LongStream;

import static java.lang.System.out;
import static java.math.BigInteger.ONE;

public class StreamFactorial {

    public static void main(String[] args) {

        printFactorialOf(100_000);
    }

    static void printFactorialOf(long num) {
        out.println(
                "factorial"                 + "\n" +
                "  of " + num               + "\n" +
                "  is " + factorial(num)
        );
    }

    static BigInteger factorial(long num) {
        return LongStream
                .rangeClosed(1, num)
                .mapToObj(BigInteger::valueOf)
                .parallel()
                .reduce(ONE, BigInteger::multiply);
    }
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822426
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма записи с переносом точки - просто ужасна ИМХО.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822427
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonФорма записи с переносом точки - просто ужасна ИМХО.
Welcome to Java 8!
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822454
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonФорма записи с переносом точки - просто ужасна ИМХО.
Вот тут чувак объясняет почему функциональная запись легче читается:
https://miles.no/blog/why-should-we-care-about-functional-programming-part-2-transformations
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822544
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моём лице вы можете найти сторонника ФП. Я всего-лишь сказал что
попытка писать в функциональном стиле на синтаксисе Java ужасает.
Когда я делаю code review/refactoring того что колбасит моя группа - то
обычно ровняю такие штуки в 1 строку. Когнитивный диссонанс от переноса
точки вызывает у меня глухое раздражение. Ничего не могу с собой поделать.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]