0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 54
1

Что не так?

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

Author24 — интернет-сервис помощи студентам
Надо написать программу которая бы считала по формуле ниже. Я написал, но выдаёт ошибку
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2017, 22:52
Ответы с готовыми решениями:

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при...

И так, что не так с моим запросом на добавление записи в таблицу?
$sql = 'INSERT INTO product ' . '(name, code, price, category_id, brand,...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float...

сегодня так можно сказать праздник так что...
простите меня за все пожалуйста!!!

33
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
05.10.2017, 01:00 21
Лучший ответ Сообщение было отмечено HanZR как решение

Решение

Author24 — интернет-сервис помощи студентам
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
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 54
05.10.2017, 01:01  [ТС] 22
Да, получается 5.677593E26 что верно в принципе. Спасибо!
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
05.10.2017, 08:21 23
Цитата Сообщение от HanZR Посмотреть сообщение
Мне казалось что это интеграл

Не по теме:

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

0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
05.10.2017, 08:35 24
ArtemFM, перестань использовать рекурсию, это плохо, пнятненько.
И подумай, нельзя ли в факториала переиспользовать значение с предыдущей итерации
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
05.10.2017, 09:00 25
xoraxax, вообще, по опыту, зачастую рекурсия выигрывает циклы. Проверенно опытом.
Во вторых, я её использую, не потому что мол круто или ещё что, просто я как раз сейчас вернулся к истокам и укрепляю познания рекурсии ибо в реализации деревьев (бинарных) приходится её юзать ибо конвертация дерева в лист проще реализуется рекурсией....точнее 4 строчки. Да и вообще много задач, где необходима мне рекурсия. А так да, её нельзя использовать где попало... А так да, можно было реализовать всё в одном методе, но делал наскоряк, ибо висят задачи по многопоточности... Спасибо за совет )
0
Kukstyler
05.10.2017, 10:09
  #26

Не по теме:

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

0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
05.10.2017, 10:14 27
Если честно, то судя по Шилдту, то он пишет, да и во многих источниках также, что рекурсия медленнее, чем циклы...
Но по опыту, а именно PerfomanceTest показывал ни раз, когда я делал 2 метода разными способами и один содержал реализацию рекурсией, что рекурсия выигрывала в 1,5 раза. Жаль, я уже не помню точных задач, где это было выявлено, но они были... Как это было выявлено. Мы с коллегой часто соревнуемся, у кого код будет работать быстрее и, кстати, он также удивлялся, когда видел, что рекурсия выигрывала зачастую. Не всегда, но всё же... Так что относительно это всё...
0
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
05.10.2017, 10:21 28
ArtemFM, на мой взгляд - значит цикл не оптимально написан.
Рекурсия создаёт в памяти отдельную копию функции для каждой итерации (естественно, вместе со своими переменными). А это требует немало "лишних" операций с памятью. Если цикл не нагромождён уймой ненужных переменных и алгоритм выбран оптимальный, то он должен быть де факто быстрее рекурсии.
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
05.10.2017, 10:35 29
Всё возможно. Я просто описываю свои наблюдения. Я не гуру так-то, а обычный прогер джун. Так что спорить не буду. Возможно и так... Буду лучше наблюдать ))) и для этого я на этом сайте и есть, чтоб черпать что-то новое... Тут зачастую такие мелочи открываются, которые в видео или книгах не найдёшь...
1
Kukstyler
05.10.2017, 10:38
  #30

Не по теме:

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

0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
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
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
05.10.2017, 21:19 32
Цитата Сообщение от Kukstyler Посмотреть сообщение
Рекурсия создаёт в памяти отдельную копию функции для каждой итерации (естественно, вместе со своими переменными). А это требует немало "лишних" операций с памятью. Если цикл не нагромождён уймой ненужных переменных и алгоритм выбран оптимальный, то он должен быть де факто быстрее рекурсии.
Не всё так просто. Если используются исключительно примитивы, например, но память выделяется на стэке, что довольно быстро. В цикле же будет использоваться операция присваивания, т.е. измения значения ячейки памяти, которая может быть в каких-то случаях может быть менее эффективна, чем создание нового кадра стэка. В общем, всё совсем не так просто и без бенчмарков тут рассуждать вообще не о чем. Которые ещё правильно нужно написать. И не забывать про разницу в архитектурах процессоров.
0
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
05.10.2017, 23:03 33
Цитата Сообщение от korvin_ Посмотреть сообщение
В цикле же будет использоваться операция присваивания
Так она же точно так-же будет использоваться для новых копий переменных, созданных в рекурсии (помимо выделения памяти на стэке).
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
06.10.2017, 19:23 34
Цитата Сообщение от Kukstyler Посмотреть сообщение
Так она же точно так-же будет использоваться для новых копий переменных, созданных в рекурсии (помимо выделения памяти на стэке).
Не совсем, это несколько разные вещи.
0
06.10.2017, 19:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2017, 19:23
Помогаю со студенческими работами здесь

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от...

Что не так, почему так происходит?
Вот bat файл @echo off for /f %%A in ('wmic path Win32_NetworkAdapter where &quot;PNPDeviceID like...

Что-то не то с Майкрсофт визуал студио 2010 или я что-то не так делаю
Дело в том что при запуске вот этой программы: #include &lt;iostream&gt; using namespace std; int main...

Посмотрите конфиг. скажите что не так или что стоит заменить?
http://kostroma.dns-shop.ru/catalog/cart/?cart_items=138239-1,143321-1,126014-1,157910-1,158182-1,12...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru