Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
HanZR
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 54
1

Что не так?

04.10.2017, 22:52. Просмотров 931. Ответов 33
Метки нет (Все метки)

Надо написать программу которая бы считала по формуле ниже. Я написал, но выдаёт ошибку
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Calc2.main(Calc2.java:7)
Что делать?
Java
1
2
3
4
5
6
7
8
9
10
public class Calc2 {
    public static void main(String[] args) {
        int n= 10;
        for (int i=0; i<=n;i++) {
            double res=(1/i)+(5*i*i*i);
            System.out.println(res);
        }
        
    }
}
P.S. значение при n=10 примерно 5.68
0
Изображения
 
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2017, 22:52
Ответы с готовыми решениями:

Что-то не так
Помогите, вот задание Поле first — дробное положительное число, оклад; поле...

Что не так с if?
Небольшой пример. public class Natur { public static void main (String...

Что не так?
Что не так с кодом? Проблема неиспользуемый main /* Среднее такое среднее...

Что не так?
Всем привет! Начал изучать Java по книжке Шилдта (Java: руководство для...

Что не так ?
Что не так в тексте запроса? querry2 = &quot;select * from AnalisisDate where...

33
ArtemFM
247 / 228 / 165
Регистрация: 10.09.2015
Сообщений: 850
05.10.2017, 01:00 21
Лучший ответ Сообщение было отмечено HanZR как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SimpleFactorial {
    public static void main(String[] args) {
        int n = 10;
        System.out.println(solution(n));
 
    }
 
    public static float solution(int n) {
       float result = 1;
        for (int i = 1; i <= n; i++) {
           result *= 1 / factorial(i) + 5 * Math.pow(i , 3);
       }
       return result;
    }
 
    public static float factorial(int n) {
        if (n == 1) {
            return 1;
        }
        return factorial(n - 1) * n;
    }
}
Добавлено через 2 минуты
вывод: 5.677593E26
1
HanZR
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 54
05.10.2017, 01:01  [ТС] 22
Да, получается 5.677593E26 что верно в принципе. Спасибо!
0
korvin_
2202 / 1693 / 323
Регистрация: 28.04.2012
Сообщений: 5,998
05.10.2017, 08:21 23
Цитата Сообщение от HanZR Посмотреть сообщение
Мне казалось что это интеграл

Не по теме:

:facepalm: как можно было такое подумать?

0
xoraxax
1376 / 1309 / 390
Регистрация: 05.07.2013
Сообщений: 6,310
Завершенные тесты: 2
05.10.2017, 08:35 24
ArtemFM, перестань использовать рекурсию, это плохо, пнятненько.
И подумай, нельзя ли в факториала переиспользовать значение с предыдущей итерации
0
ArtemFM
247 / 228 / 165
Регистрация: 10.09.2015
Сообщений: 850
05.10.2017, 09:00 25
xoraxax, вообще, по опыту, зачастую рекурсия выигрывает циклы. Проверенно опытом.
Во вторых, я её использую, не потому что мол круто или ещё что, просто я как раз сейчас вернулся к истокам и укрепляю познания рекурсии ибо в реализации деревьев (бинарных) приходится её юзать ибо конвертация дерева в лист проще реализуется рекурсией....точнее 4 строчки. Да и вообще много задач, где необходима мне рекурсия. А так да, её нельзя использовать где попало... А так да, можно было реализовать всё в одном методе, но делал наскоряк, ибо висят задачи по многопоточности... Спасибо за совет )
0
Kukstyler
05.10.2017, 10:09
  #26

Не по теме:

Цитата Сообщение от ArtemFM Посмотреть сообщение
зачастую рекурсия выигрывает циклы.
Если Вы про простоту кода, то да. Если про производительность, есть сомнения по этому поводу.

0
ArtemFM
247 / 228 / 165
Регистрация: 10.09.2015
Сообщений: 850
05.10.2017, 10:14 27
Если честно, то судя по Шилдту, то он пишет, да и во многих источниках также, что рекурсия медленнее, чем циклы...
Но по опыту, а именно PerfomanceTest показывал ни раз, когда я делал 2 метода разными способами и один содержал реализацию рекурсией, что рекурсия выигрывала в 1,5 раза. Жаль, я уже не помню точных задач, где это было выявлено, но они были... Как это было выявлено. Мы с коллегой часто соревнуемся, у кого код будет работать быстрее и, кстати, он также удивлялся, когда видел, что рекурсия выигрывала зачастую. Не всегда, но всё же... Так что относительно это всё...
0
Kukstyler
COBOL Is Everywhere
633 / 395 / 120
Регистрация: 02.04.2009
Сообщений: 1,761
05.10.2017, 10:21 28
ArtemFM, на мой взгляд - значит цикл не оптимально написан.
Рекурсия создаёт в памяти отдельную копию функции для каждой итерации (естественно, вместе со своими переменными). А это требует немало "лишних" операций с памятью. Если цикл не нагромождён уймой ненужных переменных и алгоритм выбран оптимальный, то он должен быть де факто быстрее рекурсии.
0
ArtemFM
247 / 228 / 165
Регистрация: 10.09.2015
Сообщений: 850
05.10.2017, 10:35 29
Всё возможно. Я просто описываю свои наблюдения. Я не гуру так-то, а обычный прогер джун. Так что спорить не буду. Возможно и так... Буду лучше наблюдать ))) и для этого я на этом сайте и есть, чтоб черпать что-то новое... Тут зачастую такие мелочи открываются, которые в видео или книгах не найдёшь...
1
Kukstyler
05.10.2017, 10:38
  #30

Не по теме:

Цитата Сообщение от ArtemFM Посмотреть сообщение
для этого я на этом сайте и есть, чтоб черпать что-то новое...
Я тоже. :) Кстати, я тоже далеко не гуру в данном разделе.

0
JIeIIIa
921 / 543 / 133
Регистрация: 23.05.2012
Сообщений: 7,189
05.10.2017, 14:46 31
Цитата Сообщение от ArtemFM Посмотреть сообщение
рекурсия выигрывала в 1,5 раза
Простой тест для подсчета суммы:
Кликните здесь для просмотра всего текста

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
37
38
39
40
41
42
public class TestRecursion {
    private static int maxN;
    private static double testCount = 100000.0;
 
    public static void main(String[] args) {
        maxN = 1;
        for (int i = 0; i < 5; i++) {
            System.out.println("     maxN = " + maxN);
            long start = System.currentTimeMillis();
            int result = 0;
            for (int j = 0; j < testCount; j++) {
                result = calc();
            }
            long finish = System.currentTimeMillis();
            System.out.printf("Calc          result =  %d        %f ms\n", result, (finish-start) / testCount);
            start = System.currentTimeMillis();
            for (int j = 0; j < testCount; j++) {
                result = calcRecursive(0);
            }
            finish = System.currentTimeMillis();
            System.out.printf("CalcRecursive result =  %d        %f ms\n", result, (finish-start) / testCount);
 
            maxN *= 10;
        }
    }
 
    public static int calc() {
        int result = 0;
        for (int i = 0; i < maxN; i++) {
            result += i;
        }
        return result;
    }
 
    public static int calcRecursive(int i) {
        if (i < maxN) {
            return i + calcRecursive(i + 1);
        } else {
            return 0;
        }
    }
}

Результаты:
Кликните здесь для просмотра всего текста
Код
     maxN = 1
Calc          result =  0        0,000160 ms
CalcRecursive result =  0        0,000080 ms
     maxN = 10
Calc          result =  45        0,000130 ms
CalcRecursive result =  45        0,000190 ms
     maxN = 100
Calc          result =  4950        0,000230 ms
CalcRecursive result =  4950        0,001150 ms
     maxN = 1000
Calc          result =  499500        0,001340 ms
CalcRecursive result =  499500        0,012990 ms
     maxN = 10000
Calc          result =  49995000        0,017450 ms
CalcRecursive result =  49995000        0,119320 ms

Ну и для 100000 рекурсия у меня падает со StackOverflowError, а цикл нормально вычисляется.

Некоторые алгоритмы проще с помощью рекурсии реализовать, но так чтоб она всегда работала быстрее - нет.
0
korvin_
2202 / 1693 / 323
Регистрация: 28.04.2012
Сообщений: 5,998
05.10.2017, 21:19 32
Цитата Сообщение от Kukstyler Посмотреть сообщение
Рекурсия создаёт в памяти отдельную копию функции для каждой итерации (естественно, вместе со своими переменными). А это требует немало "лишних" операций с памятью. Если цикл не нагромождён уймой ненужных переменных и алгоритм выбран оптимальный, то он должен быть де факто быстрее рекурсии.
Не всё так просто. Если используются исключительно примитивы, например, но память выделяется на стэке, что довольно быстро. В цикле же будет использоваться операция присваивания, т.е. измения значения ячейки памяти, которая может быть в каких-то случаях может быть менее эффективна, чем создание нового кадра стэка. В общем, всё совсем не так просто и без бенчмарков тут рассуждать вообще не о чем. Которые ещё правильно нужно написать. И не забывать про разницу в архитектурах процессоров.
0
Kukstyler
COBOL Is Everywhere
633 / 395 / 120
Регистрация: 02.04.2009
Сообщений: 1,761
05.10.2017, 23:03 33
Цитата Сообщение от korvin_ Посмотреть сообщение
В цикле же будет использоваться операция присваивания
Так она же точно так-же будет использоваться для новых копий переменных, созданных в рекурсии (помимо выделения памяти на стэке).
0
korvin_
2202 / 1693 / 323
Регистрация: 28.04.2012
Сообщений: 5,998
06.10.2017, 19:23 34
Цитата Сообщение от Kukstyler Посмотреть сообщение
Так она же точно так-же будет использоваться для новых копий переменных, созданных в рекурсии (помимо выделения памяти на стэке).
Не совсем, это несколько разные вещи.
0
06.10.2017, 19:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2017, 19:23

что не так?
Выручите добрые люди. есть интерфейс и класс:...

Что-то работает не так
Написал игрушку, состоящую из мира, составленного из квадратов, и игрока,...

Что не так? Java
Напишите программу для расчета по двум формулам. Предварительно подготовте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru