powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия
66 сообщений из 66, показаны все 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
Функциональный подход Рекурсия
    #38822555
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Методы с кучей параметров ты тоже в строку ровняешь? От этого никуда не дется. Так что привыкай.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как карта ляжет. Если более чем 7 аргументов - то тревожный красный флажок на доработке.
Слишком длинные имена - ну вобщем не флажок но тоже пожелание по краткости.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822671
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ моём лице вы можете найти сторонника ФП. Я всего-лишь сказал что
попытка писать в функциональном стиле на синтаксисе Java ужасает.
Когда я делаю code review/refactoring того что колбасит моя группа - то
обычно ровняю такие штуки в 1 строку. Когнитивный диссонанс от переноса
точки вызывает у меня глухое раздражение. Ничего не могу с собой поделать.

Вопрос вкуса. Мне нравится.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822757
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне тоже нравится, намного читабельнее
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38822764
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лямбды - читабельнее. Точки - втопку. Миру - мир. Всем - пива. Линуксоидам - рут с консолью.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38823012
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapvДобрый день, уважаемые форумчане.

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




Как записать такую функцию на Java 8?
на джаве надо писать через цикл.
остальное от лукавого.
ведь выше у тебя записан итеративный процесс. зачем же извращаться, когда язык джава для итеративного процесса - предоставляет такое стредство как цикл?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38823022
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaNостальное от лукавого.
ведь выше у тебя записан итеративный процесс. зачем же извращаться, когда язык джава для итеративного процесса - предоставляет такое стредство как цикл?
Ну например засунув эти "мегавычисления" в Stream API можно их на халяву распараллелить. Код останется простым, перфоманс вырастит (у меня вырос в 3 раза).
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827038
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Красота кода, вам видимо не приходилось работать в проектах где в соглашениях о форматировании требуется обязательно ставить скобки фигурные везде и начинать каждую такую скобку с новой строки :)

По функциональному коду - мне кажется что в жава он еще менее читабельный чем обычный не функциональный код..
Особенно эти пляски с опциями / туплами. Читать потом тарабарщину типа val().left().val() и тп.

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

Скала это вообще атас, тот-же старый и многословный жавовский код, но дополнительно усложненный еще сотня новых классов.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827044
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
private,

у меня блондинка есть знакомая, тоже считает, что на работе должно быть весело. Не пробовали привязать, например, воздушный шарик, чтобы ява такой скучной не казалась?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827059
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В середине 20 века тоже был идейный спор т.н. "физиков" и "лириков". Мне кажется в современном It
срезе общества тоже есть некое деление на "котелков" и "жестянщиков". "Фантазёров" и "практиков".
Теоретиков и опытных. А разработка ПО и поставка deliveries существует в ортогональном направлении.
И этому направлению как-бе по большему счёту пофиг какая стоит парадигма. Ведь в конечном счёте
люди, human resources делают задачи а не сама парадигма.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827077
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
privateПо функциональному коду - мне кажется что в жава он еще менее читабельный чем обычный не функциональный код..
Особенно эти пляски с опциями / туплами. Читать потом тарабарщину типа val().left().val() и тп.

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

Скала это вообще атас, тот-же старый и многословный жавовский код, но дополнительно усложненный еще сотня новых классов.
А есть пример современного не унылого, не многословного языка?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827401
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вычисление факториала можно еще записать используя абстракцию над функцией факториала в виде итеративной функции. Итерируется произведение каждого числа на аккумулятор.
Код: 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.
package exponenta;

import java.util.function.BinaryOperator;

public class Iter {
	
	@FunctionalInterface
	interface Fi<F, A, B, I> {
		
		I iterate(F f, A a ,B b, I i);
	}
	
    static Fi<BinaryOperator<Integer>, Integer, Integer, Integer> fi;
    static BinaryOperator<Integer> fact = (x, y) -> { return x * y; };

    public static void main(String[] args) {

    	fi = (BinaryOperator<Integer> f, Integer a, Integer b, Integer i) -> {
        	if(a > b) return i;
        	else return f.apply(fi.iterate(f, a + 1, b, i), a);
        };
        
        System.out.println(fi.iterate(fact, 1, 5, 1));
    }
    
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827402
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё факториал можно вычислить по аналитической формуле. Ваш кэп.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827403
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А есть пример современного не унылого, не многословного языка?
Руби, да даже ЖаваСкрипт и то мощнее и компактней. Кложур еще возможно, но я его не особо знаю потому утверждать не буду.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827415
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovА ещё факториал можно вычислить по аналитической формуле. Ваш кэп.
Я хотел узнать имеет ли такой способ записи право на жизнь? - прочитал в учебнике :)
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827435
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleapvВычисление факториала можно еще записать используя абстракцию над функцией факториала в виде итеративной функции. Итерируется произведение каждого числа на аккумулятор.
Код: 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.
package exponenta;

import java.util.function.BinaryOperator;

public class Iter {
	
	@FunctionalInterface
	interface Fi<F, A, B, I> {
		
		I iterate(F f, A a ,B b, I i);
	}
	
    static Fi<BinaryOperator<Integer>, Integer, Integer, Integer> fi;
    static BinaryOperator<Integer> fact = (x, y) -> { return x * y; };

    public static void main(String[] args) {

    	fi = (BinaryOperator<Integer> f, Integer a, Integer b, Integer i) -> {
        	if(a > b) return i;
        	else return f.apply(fi.iterate(f, a + 1, b, i), a);
        };
        
        System.out.println(fi.iterate(fact, 1, 5, 1));
    }
    
}


Вот это шлак..
Лямбды тут ну ни разу не нужны.
Параметры f и i не нужны - всегда передаётся одно и тоже.

Если это выбросить останется всего лишь:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
package iter;

import static java.lang.System.out;

public class Iter {

    public static void main(String[] args) {
        out.println(fi(1, 5));
    }

    static int fi(int a, int b) {
        return a > b ? 1 : fi(a + 1, b) * a;
    }
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827461
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашибись алгоритмы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
package iter;
import static java.lang.System.out;
public class Iter {
    public static void main(String[] args) {
        int i = Integer.parseInt(args[0]);
        out.println(i + ": " + fi(1, i));
    }
    static int fi(int a, int b) {
        return a > b ? 1 : fi(a + 1, b) * a;
    }
}

Код: plaintext
1.
2.
> for %A in (29 30) do @java -cp bin iter.Iter %A
29: -1241513984
30: 1409286144
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827514
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЗашибись алгоритмы
А нехрен больше двенадцати в такое передавать..
В оригинале был инт, я инт и оставил.

Код с BigInt'ами уже был приведён.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827593
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрать второй ненужный параметр и преобразовать хвостовую рекурсию в явный цикл - не бином ньютона. Раз уж наш класс назван Iter.
Кинуть исключение по выходу аргумента за допустимые пределы - тоже.
Заменить int на long - вообще не требует напряжения мысли.
И в чём остаётся смысл покритиковать корявый код, приведя другой корявый код?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827670
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЗаменить int на long
Доо. Вот это идея! 20 первых чисел против 12 - это, конечно, ни разу не корявый код.

Basil A. SidorovИ в чём остаётся смысл покритиковать корявый код, приведя другой корявый код?
А вот чтобы показать что останется если убрать лямбды и 2 не нужных параметра (и алгоритм оставить тем же).
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827798
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private> А есть пример современного не унылого, не многословного языка?
Руби, да даже ЖаваСкрипт и то мощнее и компактней. Кложур еще возможно, но я его не особо знаю потому утверждать не буду.

ладно, руби - для поклонников сайт за 1 день, но JS то чем мощнее?:( Я всегда думал, что у JS и Java слегка разные сферы применения....;)
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827838
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkА есть пример современного не унылого, не многословного языка?
93 год подойдет?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827846
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateда даже ЖаваСкрипт и то мощнее и компактней.

Язык в котором наследование надо делать самому и через одно место не может быть "мощнее". Вся его мощь в отсутствии типизации и возможности ссылаться на функции.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827894
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Если учесть что на горизонте ECMA 6, и node.js из всех шелей выползает. То что то у Java JS всё таки отожмёт в ближайшее время.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827913
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkЕсли учесть что на горизонте ECMA 6, и node.js из всех шелей выползает. То что то у Java JS всё таки отожмёт в ближайшее время.Не отожмёт. Яве уже лет 15 как пророчат - скоро яве трындец, скоро ява пропадёт и т.д.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38827951
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ей может быть трындец? Вы лучше спросите когда байт-коду трындец.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38828023
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевavp.mkА есть пример современного не унылого, не многословного языка?
93 год подойдет?
Вот и так всегда =)

Какой-нибудь мегакритик пишет, что java - говно, c# - для быдла, scala - многословня.
У него спрашиваешь: "А на чём писать хорошо?". А он тебе про паскаль или про джаваскрипт.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38828839
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Не у меня, я просто встрял.

Но Вы спрашивали - пример современного не унылого, не многословного языка

Про на чём писать хорошо речи небыло.

P.S. Брится удобнее бритвой, колбасу нарезать ножом, а универсальный инструмент - топор.
IMHO выбор инструмента - вопрос привычки и обстоятельств.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38829057
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторладно, руби - для поклонников сайт за 1 день, но JS то чем мощнее?:( Я всегда думал, что у JS и Java слегка разные сферы применения....;)
Мы не про сферы применения и реализацию говорим а про язык.
ЖаваСкрипт почти не уступает руби по мощности, особенно если бы можно было исправит его чуть. В нем от жавы одно только название да внешне похожий синтаксис, ну и классы еще по дурацкому сделаны чтобы создать видимость классического ООП вместо прототипов.

Кто-то выше упомянул что там нет классов нормальных - там есть гораздо более мощная концепция прототипов , просто она очень по дурацки сделана как писал выше.
И исправить ее нельзя из-за обратной срвместимости.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38829074
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это не самое худшее, на жава можно писать простой и обычный хороший код.

Хуже всего в жава это сообщество которое начиталось паттерны программирования, статей индусских маркетологов про то как классно писать ХМЛ и расширяемую архитектуру и каждый второй добавляет себе приставку синьера или архитектора и создает классы с интерфейсами и фактор методами пачками там где можно написать какой нить простой и маленький кусок кода.

Это особенно заметно когда начинаешь смотреть исходники открытых проектов - где на жаве через каждый второй думаешь - вто за сумасшедший все это писал так что вместо пары строчек нагорожено черти чо.

Теже логи - любой проект запустить - он выдаст с десяток экранов всякой ерунды в лог.

Или тестовые фреймворки - пишут в логи все что угодно кроме списка заваленых тестов и стектрейса - и сиди их настраивай
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38829087
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateТеже логи - любой проект запустить - он выдаст с десяток экранов всякой ерунды в лог.

Или тестовые фреймворки - пишут в логи все что угодно кроме списка заваленых тестов и стектрейса - и сиди их настраивайВсе логовые фреймворки в яве адское говнище.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38832230
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжение темы. Есть сортировка Хоара:
Код: 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.
32.
33.
34.
35.
36.
package sort.hoar;

public class Proc {
	
	public void sort(int[] a, int l, int r) {
		int x = a[(l + r) / 2 - 1];
		int i = l, j = r;
		while (i <= j) {
			while (a[i - 1] < x) i++;
			while (a[j - 1] > x) j--;
			if (i <= j) {
				int w = a[i - 1]; a[i - 1] = a[j - 1]; a[j - 1] = w; i++; j--;
			}
		}
		if (l < j) sort(a, l, j);
		if (i < r) sort(a, i, r);
	}
	
	public static void main(String[] args) {
		System.out.println("a");
		int[] a = new int[] { 44, 55, 12, 42, 94, 6, 18, 67 };
		int k = 0;
		while (k < a.length) {
			System.out.print(" " + a[k]);
			k++;
		}
		new Proc().sort(a, 1, a.length);
		System.out.println("");
		k = 0;
		while (k < a.length) {
			System.out.print(" " + a[k]);
			k++;
		}
	}

}



Используя F# можно коротко записать почти этот алгоритм:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
let l = [ 44; 55; 12; 42; 94; 6; 18; 67 ]
l |> List.iter (fun x -> printf " %i" x);;  

let rec quicksort = function
| [] -> []
| h::t -> quicksort ([ for x in t do if x<=h then yield x]) 
        @ [h] @ quicksort ([ for x in t do if x>h then yield x]);;
  
printfn "";;
quicksort l |> List.iter (fun x -> printf " %i" x);;  



Как используя возможности 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.
32.
33.
package sort.hoar;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Func {

    public static void main(String[] args) {
    	
    	List<Integer> l = new ArrayList<Integer>(Arrays.asList( 44, 55, 12, 42, 94, 6, 18, 67 ));
       	l.forEach(x -> System.out.print(" " + x));
       	System.out.println();
       	sort(l).forEach(x -> System.out.print(" " + x));
    }
   
	static List<Integer> sort(List<Integer> l) {
		
		List<Integer> sl = new ArrayList<Integer>();
		
		if(!l.isEmpty()) {
			int h = l.get(0);

			sl = sort(l.stream().filter(x -> x < h).collect(Collectors.toList()));
	    	        sl.add(h); 
	    	        sl.addAll(sort(l.stream().filter(x -> x > h).collect(Collectors.toList())));
	
		}
    	return sl;
	}
	
}
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38832388
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу логов - согласен. Их действительно читать бывает трудно. Мы подпиливали
log4j конфигурации так чтобы хотя-бы package name не логгировалось. Простыня сократилась
где-то на 50% из за схлопывания com.mycompany.mydept.myfuckenproject..... e.t.c.

Формат даты везде где только можно "ужимали".
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38832389
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу паттерно в Java - ходит новый анекдот. Синьор не тот кто знает паттерны а тот
кто может обосновать их ненужность и выкинуть нахер из проекта.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38832558
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМы подпиливали log4j конфигурацииЭ-э-э ... Простая мысль, что конфигурацию пишет тот, кто будет читать лог это нечто новое и оригинальное?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38832650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логи читают админы заказчика. Но им пофиг. Они будут грызть гранит и копать от забора
до обеда. Но иногда нас тоже просят почитать логи.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38833138
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень хорошая мысль, я думаю сайты тоже нужно делать чтобы по кмолчанию они выглядели как куча бессвязного текста, а те кто читает их пусть настраивают свой CSS как им надо.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38833160
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateОчень хорошая мысль, я думаю сайты тоже нужно делать чтобы по кмолчанию они выглядели как куча бессвязного текста, а те кто читает их пусть настраивают свой CSS как им надо."Хорошая мысль" это когда сайты приемлимо выглядят и без всякого CSS.

P.S. Я, например, настраивал формат логов так, как это было удобно мне.
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38833310
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А когда логи приемлемо выглядят без настройки это плохая мысль?
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38833489
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати про ограниченность жаваскрипте и отсутствие классов и наследование - я написал статью где показал как можно легко организовать классы, наследование, трейты, множественное наследование, перегрузку методов и тп с помощью функциональных миксинов http://jslang.info/blog/2012/functional-mixins
...
Рейтинг: 0 / 0
Функциональный подход Рекурсия
    #38833531
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateА когда логи приемлемо выглядят без настройки это плохая мысль?Великолепная. Одна проблема - у разработчика и сисадмина могут быть разные представления о приемлимости.
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональный подход Рекурсия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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