Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия / 25 сообщений из 66, страница 1 из 3
01.12.2014, 10:05
    #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
01.12.2014, 10:13
    #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
01.12.2014, 10:16
    #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
01.12.2014, 10:17
    #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
01.12.2014, 10:20
    #38821071
aleapv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
Blazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?
...
Рейтинг: 0 / 0
01.12.2014, 10:22
    #38821074
aleapv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
Нет, имеется в виду не просто рекурсия, а как математическое определение факториала, которые позволяют функциональные языки - лямбда-выражения.
...
Рейтинг: 0 / 0
01.12.2014, 10:24
    #38821079
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
aleapvBlazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?
Через Stream API
https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
Java не функциональный язык.
...
Рейтинг: 0 / 0
01.12.2014, 10:26
    #38821082
aleapv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
Blazkowicz,

спасибо, теперь есть с чего начать :)
...
Рейтинг: 0 / 0
01.12.2014, 10:44
    #38821111
aleapv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
А я правильно понимаю что для человека знающего java и желающего развития, получается лучше изучить java8 чем scala? Это же ему ближе и возможности получается что такие-же?
...
Рейтинг: 0 / 0
01.12.2014, 10:47
    #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
01.12.2014, 10:55
    #38821122
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
aleapvBlazkowicz, то есть записывается не совсем в функциональном стиле. А возможна ли тогда редукция(преобразование как в F# и др.) для таких выражений?

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

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

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

Для java есть что то подобное : http://habrahabr.ru/post/113128/
...
Рейтинг: 0 / 0
01.12.2014, 12:42
    #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
01.12.2014, 16:11
    #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
01.12.2014, 16:13
    #38821537
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
avp.mkМожно без боксинга, не определяя своих fi.
Только проблему переполнения инта и стека это не решает ни разу.
...
Рейтинг: 0 / 0
01.12.2014, 16:59
    #38821615
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
avp.mkТолько проблему переполнения инта и стека это не решает ни разу.+100500
...
Рейтинг: 0 / 0
01.12.2014, 17:12
    #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
01.12.2014, 17:39
    #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
01.12.2014, 17:46
    #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
01.12.2014, 17:57
    #38821729
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
Хех. Яже пишу выше. Не по Java.
...
Рейтинг: 0 / 0
01.12.2014, 22:00
    #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
02.12.2014, 12:33
    #38822426
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
Форма записи с переносом точки - просто ужасна ИМХО.
...
Рейтинг: 0 / 0
02.12.2014, 12:33
    #38822427
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
maytonФорма записи с переносом точки - просто ужасна ИМХО.
Welcome to Java 8!
...
Рейтинг: 0 / 0
02.12.2014, 12:43
    #38822454
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
maytonФорма записи с переносом точки - просто ужасна ИМХО.
Вот тут чувак объясняет почему функциональная запись легче читается:
https://miles.no/blog/why-should-we-care-about-functional-programming-part-2-transformations
...
Рейтинг: 0 / 0
02.12.2014, 13:38
    #38822544
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональный подход Рекурсия
В моём лице вы можете найти сторонника ФП. Я всего-лишь сказал что
попытка писать в функциональном стиле на синтаксисе Java ужасает.
Когда я делаю code review/refactoring того что колбасит моя группа - то
обычно ровняю такие штуки в 1 строку. Когнитивный диссонанс от переноса
точки вызывает у меня глухое раздражение. Ничего не могу с собой поделать.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия / 25 сообщений из 66, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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