Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Имитация цикла 
:(
    Опции темы
4epT
Дата 15.2.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый вечер всем) Программирую на Java уже более 2-х лет, вчера девушка попросила сделать лабу в универе ... задание таково: дан двумерный массив, посчитать сумму его элементов без использования циклов. Подсчет суммы делается через метод класса, класс принимает сам массив. Честно скажу меня этим вопросом просто поставили в тупик ... это вообще возможно сделать ?
PM MAIL   Вверх
XoJIoD
Дата 15.2.2011, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



вот пример с помощью рекурсии. Только осторожно можно нарватся на StackOverflowError при больших масивах. 
Лудше для рекурсии использовать какойнибудь я зык с хвостовой рекурсией например java_script.

Код

import java.util.Random;

public class Recursion {

    private static final Random RANDOM = new Random();

    private static int[][] generate(int m, int n) {
        int[][] result = new int[m][m];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {

                result[i][j] = RANDOM.nextInt() % 12;
                System.out.print(result[i][j] + " ");
            }
            System.out.println();
        }
        return result;
    }

    //Сумма строк
    private static int sumRecursion(int mass[][], int i) {
        if (i == mass.length - 1)
            return sumRecursion(mass[i], 0);
        return sumRecursion(mass[i], 0) + sumRecursion(mass, i + 1);
    }

    //Сумма в строке
    private static int sumRecursion(int mass[], int i) {
        if (i == mass.length - 1)
            return mass[i];
        else
            return sumRecursion(mass, i + 1) + mass[i];
    }

    public static void main(String[] args) {
        int mass[][] = generate(2, 2);
        System.out.println(sumRecursion(mass, 0));
    }
}


PM MAIL   Вверх
4epT
Дата 15.2.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



спасибо конечно) через рекурсию я бы написал. по требованию делать с 1 параметром и этот параметр сам массив.

мало того это первый курс института, они прошли только типы данных и операторы ветвления.
PM MAIL   Вверх
mimik
Дата 15.2.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 1.11.2010

Репутация: нет
Всего: 2



Цитата(4epT @  15.2.2011,  23:09 Найти цитируемый пост)
по требованию делать с 1 параметром и этот параметр сам массив.

можно заменить второй параметр свойством класса

Это сообщение отредактировал(а) mimik - 15.2.2011, 23:19
PM   Вверх
4epT
Дата 15.2.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(mimik @ 15.2.2011,  23:18)
Цитата(4epT @  15.2.2011,  23:09 Найти цитируемый пост)
по требованию делать с 1 параметром и этот параметр сам массив.

можно заменить второй параметр свойством класса

да, думал об этом) 

еще есть какие то варианты или это единственный способ ?
PM MAIL   Вверх
XoJIoD
Дата 15.2.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



 smile 

Код

    private static int sum(int mass[][]) {

        int sum = 0;
        if (mass.length < 1 && mass[1].length < 1)
            sum = sum + mass[0][0];
        if (mass.length < 1 && mass[1].length < 2)
            sum = sum + mass[0][1];
        if (mass.length < 1 && mass[1].length < 3)
            sum = sum + mass[0][2];
                    ...
        return sum;
    }


Это сообщение отредактировал(а) XoJIoD - 15.2.2011, 23:27
PM MAIL   Вверх
mimik
Дата 15.2.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 1.11.2010

Репутация: нет
Всего: 2



Цитата(4epT @  15.2.2011,  23:09 Найти цитируемый пост)
они прошли только типы данных и операторы ветвления.

т.е. они прошли массивы, а циклы пока нет, мдааа smile 
PM   Вверх
4epT
Дата 15.2.2011, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(XoJIoD @ 15.2.2011,  23:24)
smile 

Код

    private static int sum(int mass[][]) {

        int sum = 0;
        if (mass.length < 1 && mass[1].length < 1)
            sum = sum + mass[0][0];
        if (mass.length < 1 && mass[1].length < 2)
            sum = sum + mass[0][1];
        if (mass.length < 1 && mass[1].length < 3)
            sum = sum + mass[0][2];
                    ...
        return sum;
    }

так и написал))) посмотрим что скажет преподаватель )))

а насчет тупости программы согласен) мало того они должны все писать в main методе, так как они еще не должны знать как писать свои методы.
PM MAIL   Вверх
Connie
Дата 16.2.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



4epT, а они именно java изучают, не C++ случаем?
PM MAIL WWW   Вверх
4epT
Дата 16.2.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(Connie @ 16.2.2011,  10:37)
4epT, а они именно java изучают, не C++ случаем?

чисто Java =)
PM MAIL   Вверх
Дрон
Дата 16.2.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 93



Цитата(4epT @  15.2.2011,  23:09 Найти цитируемый пост)
 по требованию делать с 1 параметром и этот параметр сам массив.

Я так сходу код не напишу, но вот какая мысль на тему рекурсии: а что если сделать метод, который разбивает входной массив на два (или N) меньших массива и вызывает себя же для этих двух массивов. И так пока на входе не окажется массив из одного элемента. Так и рекурсия не слишком глубокой получится.

Вопрос лишь в реализации получения части массива без циклов -- не знаю есть ли в Java нужные  методы.



--------------------
Да. Именно так.
PM   Вверх
AntonSaburov
Дата 16.2.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Развлекся smile Рекурсивный вызов с передачей индекса элемента, который надо добавить в сумму.
Но при больших массивах StackOverflowError получаем.


Код

public class Main {
    public static void main(String[] args) {
        Main m = new Main();
        m.execute();
    }
    private void execute() {
        // Это инициализация - так что не в счет :)
        int[][] mas = new int[10][20];
        double summa = 0;
        for (int i = 0; i < mas.length; i++) {
            for (int j = 0; j < mas[i].length; j++) {
                mas[i][j] = i + j*2;
                summa += mas[i][j];
            }
        }
        // Для контроля правильности
        System.out.println("Control summa=" + summa);
        double realSumma = recursive(mas, 0, 0);
        System.out.println("Real summa=" + realSumma);
    }
    private double recursive(int[][] mas, int i, int j) {
        double s = mas[i][j];
        if (j < mas[i].length - 1) {
            s += recursive(mas, i, ++j);
        } else if (i < mas.length - 1) {
            s += recursive(mas, ++i, 0);
        }
        return s;
    }
}

PM MAIL WWW ICQ   Вверх
Connie
Дата 16.2.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



AntonSaburov, но ведь в функцию должен передаваться один параметр http://forum.vingrad.ru/index.php?showtopi...t&p=2300226
Интересно, а можно использовать статические переменные? smile 


Навеяло
http://ithappens.ru/story/5286
http://ithappens.ru/story/5325

Сорри, модеры, навеяло smile

Это сообщение отредактировал(а) Connie - 16.2.2011, 19:22
PM MAIL WWW   Вверх
Samotnik
Дата 16.2.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Всё бы ничего, но :
Цитата(4epT @  15.2.2011,  23:46 Найти цитируемый пост)
так как они еще не должны знать как писать свои методы

следовательно, при решении этой задачи, нельзя:
а. писать/вызывать/ свои методы
б. использовать циклы
 smile 
PM MAIL   Вверх
4epT
Дата 16.2.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



та тут походу только в тупую перебором =) ифанычами)

кстати, кто нибудь знает что такое точное и не точное сравнение чисел ? тип double
PM MAIL   Вверх
Connie
Дата 16.2.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



4epT, у skipy  про это было, кратко так
два числа 0,0 и 0,0000000000001 равны или нет?

http://www.skipy.ru/technics/objCompPr.html#real_comp
Правильно сравнивать примерно так
Math.abs(a - b)<0.0001 если меньше, то считаем равным, предел нужно свой выбирать.

Это сообщение отредактировал(а) Connie - 17.2.2011, 13:36
PM MAIL WWW   Вверх
aleksandy
Дата 17.2.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Цитата

max(a - b)<0.0001

Наверное, имелся ввиду abs
PM   Вверх
Connie
Дата 17.2.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



aleksandy, да, конечно smile
PM MAIL WWW   Вверх
AntonSaburov
Дата 17.2.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Connie @  16.2.2011,  19:21 Найти цитируемый пост)
AntonSaburov, но ведь в функцию должен передаваться один параметр

Где-то написано, что потом нельзя вызывать метод с несколькими параметрами ?
Создатель топика программирует уже 2 года - наверно хватит ума сделать вызов с передачей массива, а внутри уже вызывать рекурсию.

PM MAIL WWW ICQ   Вверх
mbasil
Дата 19.2.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 2
Всего: 13



double a ..., b...;

Ну небось точное:

if( a == b ) . . .

а не точное, что нибудь в роде:

double DELTA = 0.001;

if( Math.abs(a-b) < DELTA ) . . .

То есть если вы получаете a или b вычислением,
то проверять на равенство нужно с учетом точности 
PM MAIL   Вверх
mbasil
Дата 19.2.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 2
Всего: 13



Если массив одномерный можно и схитрить, спрятав индекс и сумму в самом массив, например так:
Код

public class Test {
 public static void main(String[] args) {
        int i;
        int[] m1 = new int[10];
        StringBuilder sb = new StringBuilder();
        for( i = 0; i < m1.length; i++) {
                m1[i] = (int)(20 * Math.random());
                sb.append(m1[i]).append("  ");
        }
        double sum = 0;
        for( i = 0; i < m1.length; i++ ) {
                sum += m1[i];
        }
        System.out.println( sb );
        System.out.println( "sum = " + sum);
        int[] m2 = new int[m1.length+2];
        System.arraycopy( m1, 0, m2, 2, m1.length ); 
        m2[1] = m2[0] = 0;

        sum = sumRecursion( m2 );
        System.out.println( "sum = " + sum);
  }
  private static int sumRecursion( int[] p_m ) {
        if( p_m[1] < p_m.length-2 ) {
              p_m[0] +=  p_m[2+p_m[1]++];
              return sumRecursion( p_m );
        }
        return p_m[0];
  }
}

PM MAIL   Вверх
миг
Дата 19.2.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



что за..  smile Циклы как раз и были созданы, чтобы перемещаться по массивам. А если без циклов, то напрашивается рекурсия.. Хотя рекурсия это не рациональный способ. Даже использование оператора goto было бы более рационально, чем рекурсия. smile 
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
4epT
Дата 20.2.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(миг @ 19.2.2011,  19:13)
что за..  smile Циклы как раз и были созданы, чтобы перемещаться по массивам. А если без циклов, то напрашивается рекурсия.. Хотя рекурсия это не рациональный способ. Даже использование оператора goto было бы более рационально, чем рекурсия. smile

goto в Java нет) разве что break/continue label;

на таким способом не решишь эту задачу. только через рекурсию ... самый простой способ наверное обернуть те два метода которые написал XoJIoD, в функцию с одним параметром =)

а насчет точного и неточного сравнения, так что то и не понял ... то есть как это делается все понятно, но почему то кажется что a == b это как раз не точно сравнение.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.