Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
1

Обновление переменной и рекурсия

08.02.2019, 09:43. Показов 5289. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Пытался переписать рекурсивный метод для языка Java (изначально метод написан на языке C++). Но столкнулся со следующей проблемой: во-первых, в Java, как я понял, нельзя передавать параметр по умолчанию, а во-вторых и что самое главное, я не смог использовать статическую переменную внутри рекурсивной функции, чтобы она обновлялась при каждом вызове этой функции. Подскажите, пожалуйста, как это можно сделать на Java и, если можно, с небольшим примером.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2019, 09:43
Ответы с готовыми решениями:

Вечное обновление элемента (или вечная рекурсия)
На форму необходимо вывести часы попытался циклом при создании, так и не дождался отрисовки окна. ...

Обновление переменной
Добрый день, зашел в тупик. Как обновлять переменную date1 после цикла? DateTime date1 =...

Обновление переменной
Добрый вечер, ищу помощи у более опытных специалистов (я специалист? пфф). Решил сделать что-то...

обновление переменной
вообщем есть post запрос к 2.php эта страница index.php. на странице index.php есть переменная...

17
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2
08.02.2019, 09:49 2
считаем от 0 до 10 с помощью рекурсии и статической переменной
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static int i = 0;
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        go();
    }
 
    private static void go() {
        if(i < 11){
            System.out.println(i);
            i++;
            go();
        }
    }
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
08.02.2019, 09:55 3
Цитата Сообщение от Fixer_84 Посмотреть сообщение
чтобы она обновлялась при каждом вызове этой функции
не понятно, что ты имеешь ввиду?
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Helper {
    static int a = 11;
    static void recers(int x) {
        if (x == 0)
            return;
        System.out.println(x);
        recers(x - 1);
    }
 
    public static void main(String[] args) {
        recers(a);
    }
1
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2
08.02.2019, 09:57 4
Цитата Сообщение от Aviz__ Посмотреть сообщение
что ты имеешь ввиду?
наверное забыл изменять ее
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
08.02.2019, 10:05 5
не, понял, что он хотел!
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Helper {
    static int[] a = {11};
 
    static void recers(int [] x) {
        if (x[0] == 0)
            return;
        x[0]--;
        System.out.println(x[0]);
        recers(x);
    }
 
    public static void main(String[] args) {
        recers(a);
        System.out.println(a[0]);
    }
}
1
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2
08.02.2019, 10:52 6
Цитата Сообщение от Aviz__ Посмотреть сообщение
что он хотел!
Сам ничерта не понял, если бы он хоть код выложил, было бы понятней, а так приходся играться в ектрасенсов
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
08.02.2019, 11:42 7
InvalidCode, он хотел в методе изменить значение переменной, которая вне метода.
1
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2
08.02.2019, 12:57 8
Цитата Сообщение от Aviz__ Посмотреть сообщение
которая вне метода.
Так в чем проблема то? модификаторы видимости зачем нужны?
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
08.02.2019, 13:19 9
Цитата Сообщение от InvalidCode Посмотреть сообщение
проблема то?
ну попробуй, не ссылочную переменную изменить в методе так, чтобы ее значение вне метода, так же изменилось!
1
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2
08.02.2019, 14:00 10
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Help {
    public static int i = 0;
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        go();
    }
 
    private static void go() {
        if(i < 11){
            System.out.println(i);
            i++;
            go();
        }
    }
    
}
результат
run:
0
1
2
3
4
5
6
7
8
9
10
BUILD SUCCESSFUL (total time: 1 second)
Добавлено через 9 минут
public: публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов.

private: закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе.

protected: такой класс или член класса доступен из любого места в текущем классе или пакете или в производных классах, даже если они находятся в других пакетах

Модификатор по умолчанию. Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.

...

Казалось бы, почему бы не объявить все переменные и методы с модификатором public, чтобы они были доступны в любой точке программы вне зависимости от пакета или класса? Возьмем, например, поле age, которое представляет возраст. Если другой класс имеет прямой доступ к этому полю, то есть вероятность, что в процессе работы программы ему будет передано некорректное значение, например, отрицательное число. Подобное изменение данных не является желательным. Либо же мы хотим, чтобы некоторые данные были достуны напрямую, чтобы их можно было вывести на консоль или просто узнать их значение. В этой связи рекомендуется как можно больше ограничивать доступ к данным, чтобы защитить их от нежелательного доступа извне (как для получения значения, так и для его изменения). Использование различных модификаторов гарантирует, что данные не будут искажены или изменены не надлежащим образом.
от-сюда
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
08.02.2019, 15:22 11
InvalidCode,
вот, что я понимаю под рекурсией:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Help {
    public static int i = 0;
    
    public static void main(String[] args) {
        go(i);
        System.out.println(i);
    }
 
    private static void go(int x) {
        if(x > 11)
            return;
        System.out.println(x);
        go(x + 1); 
    }
}
1
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
08.02.2019, 18:54  [ТС] 12
Цитата Сообщение от InvalidCode Посмотреть сообщение
Сам ничерта не понял, если бы он хоть код выложил, было бы понятней, а так приходся играться в ектрасенсов
Aviz__, InvalidCode, спасибо за ваши ответы. Проблема в том, что в Java нельзя использовать статические переменные внутри метода, а также параметры по умолчанию. Раньше было так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void spiral(int[][] a, int n, int d = 0; int k = 1) {
        int i, j;
        i = n - 1 - d;
        for (j = n + d; j >= n - 1 - d; j--) {
            a[i][j] = k++;
        }
        j = n - 1 - d;
        for (i = n - d; i <= n + d; i++) {
            a[i][j] = k++;
        }
        i = n + 1 + d;
        for (j = n - 1 - d; j <= n + d; j++) {
            a[i][j] = k++;
        }
        j = n + 1 + d;
        for (i = n + 1 + d; i >= n - 1 - d; i--) {
            a[i][j] = k++;
        }
        if (d < n - 1) {
            spiral(a, n, d + 1, k); //Здесь нужно вызывать функцию с параметрами d и k.
        }
    }
И я спокойно вызывал рекурсивную функцию с параметрами d и k по умолчанию (в 20 строке). Но в Java они запрещены и я решил использовать статические переменные так:

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
public static void spiral(int[][] a, int n) {
        int i, j;
        static int d = 0;
        static int k = 1;
        i = n - 1 - d;
        for (j = n + d; j >= n - 1 - d; j--) {
            a[i][j] = k++;
        }
        j = n - 1 - d;
        for (i = n - d; i <= n + d; i++) {
            a[i][j] = k++;
        }
        i = n + 1 + d;
        for (j = n - 1 - d; j <= n + d; j++) {
            a[i][j] = k++;
        }
        j = n + 1 + d;
        for (i = n + 1 + d; i >= n - 1 - d; i--) {
            a[i][j] = k++;
        }
        if (d < n - 1) {
            spiral(a, n, d + 1, k); //Здесь нужно вызывать функцию с параметрами d и k.
        }
    }
Но опять же, Java не разрешила их использование внутри метода spiral(). Что мне делать теперь не знаю. Как пользоваться методом или переписывать все придется.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
08.02.2019, 19:12 13
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Проблема в том, что в Java нельзя использовать статические переменные внутри метода,
Пока сложно понять что вы хотите.
Статические переменные общее для всех экземпляров класса. Они должны быть на уровне класса.
Если вы хотите чтобы для каждого экземпляра класса вызывался свой spiral() и ваши "начальные" значения не перемешивалить (при обновлении при каждом вызове) между экземплярами не перемешивались, их надо разделить, сделать не статическими а инстанс.
1
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
08.02.2019, 19:24  [ТС] 14
ViktorFX, здравствуйте! Спасибо за ваш ответ. Я хочу вызывать рекурсивную функцию spiral() снова и снова, и чтобы при каждом ее вызове эти переменные не теряли значение. То есть, чтобы спираль раскручивалась.

Добавлено через 6 минут
ViktorFX, раньше (в C++) код был таким:

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
import java.util.Scanner;
 
public class Main {
 
    public static void spiral(int[][] a, int n, int d = 0, int k = 1) {
        int i, j;
        i = n - 1 - d;
        for (j = n + d; j >= n - 1 - d; j--) {
            a[i][j] = k++;
        }
        j = n - 1 - d;
        for (i = n - d; i <= n + d; i++) {
            a[i][j] = k++;
        }
        i = n + 1 + d;
        for (j = n - 1 - d; j <= n + d; j++) {
            a[i][j] = k++;
        }
        j = n + 1 + d;
        for (i = n + 1 + d; i >= n - 1 - d; i--) {
            a[i][j] = k++;
        }
        if (d < n - 1) {
            spiral(a, n, d + 1, k);
        }
    }
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        n = in.nextInt();
        int[][] a = new int[2*n+1][2*n+1];
        spiral(a, n); //Здесь вызов функции с параметрами по умолчанию (в C++ они не передаются при вызове функции)
        for (int i = 0; i < 2 * n + 1; i++) {
            for (int j = 0; j < 2 * n + 1; j++)
                System.out.printf("%d ", a[i][j]);
        }
        System.out.printf("\n");
        }
    }
Но в Java он не запускается. Вопрос, как можно адаптировать код под Java, если это вообще возможно?
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17589 / 10339 / 2825
Регистрация: 21.10.2017
Сообщений: 22,412
08.02.2019, 19:38 15
Fixer_84, а что мешает передать "значения по умолчанию" при первом вызове метода?
Ну, это если я правильно понял ситуацию...
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
08.02.2019, 19:39 16
Fixer_84,
Я в код не вникал, что такое n вообще не знаю, синтаксис не проверял (пишу прямо в форуме).
Вот идея от Aviz__, InvalidCode, (насколько я понял, думаю они сами потом ответят)
применимая к вашей задачи.
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
public class MyClass {
    static int d = 0;
    static int k = 1;
    public static void main(String[] args) {
          int[][] a = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};    
          int n = 0;
          spiral(a, n);
    }
    public static void spiral(int[][] a, int n) {
        int i, j;
//        static int d = 0;
//        static int k = 1;
        i = n - 1 - d;
        for (j = n + d; j >= n - 1 - d; j--) {
            a[i][j] = k++;
        }
        j = n - 1 - d;
        for (i = n - d; i <= n + d; i++) {
            a[i][j] = k++;
        }
        i = n + 1 + d;
        for (j = n - 1 - d; j <= n + d; j++) {
            a[i][j] = k++;
        }
        j = n + 1 + d;
        for (i = n + 1 + d; i >= n - 1 - d; i--) {
            a[i][j] = k++;
        }
        if (d < n - 1) {
            d++;
            spiral(a, n);
//            spiral(a, n, d + 1, k); //Здесь нужно вызывать функцию с параметрами d и k.
        }
    }
}
1
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17589 / 10339 / 2825
Регистрация: 21.10.2017
Сообщений: 22,412
08.02.2019, 19:46 17
Лучший ответ Сообщение было отмечено Fixer_84 как решение

Решение

Fixer_84, типа того
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
 public static void spiral(int[][] a, int n, int d, int k) {
        int i, j;
        i = n - 1 - d;
        for (j = n + d; j >= n - 1 - d; j--) {
            a[i][j] = k++;
        }
        j = n - 1 - d;
        for (i = n - d; i <= n + d; i++) {
            a[i][j] = k++;
        }
        i = n + 1 + d;
        for (j = n - 1 - d; j <= n + d; j++) {
            a[i][j] = k++;
        }
        j = n + 1 + d;
        for (i = n + 1 + d; i >= n - 1 - d; i--) {
            a[i][j] = k++;
        }
        if (d < n - 1) {
            spiral(a, n, ++d, k);
        }
    }
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        n = in.nextInt();
        int[][] a = new int[2 * n + 1][2 * n + 1];
        spiral(a, n, 0, 1); //Здесь вызов функции с параметрами по умолчанию (в C++ они не передаются при вызове
        // функции)
        for (int i = 0; i < 2 * n + 1; i++) {
            for (int j = 0; j < 2 * n + 1; j++) {
                System.out.print(a[i][j] + "\t");
            }
        System.out.println();
        }
    }
Bash
1
2
3
4
5
6
7
8
9
10
11
12
5
90  89  88  87  86  85  84  83  82  81  120 
91  56  55  54  53  52  51  50  49  80  119 
92  57  30  29  28  27  26  25  48  79  118 
93  58  31  12  11  10  9   24  47  78  117 
94  59  32  13  2   1   8   23  46  77  116 
95  60  33  14  3   0   7   22  45  76  115 
96  61  34  15  4   5   6   21  44  75  114 
97  62  35  16  17  18  19  20  43  74  113 
98  63  36  37  38  39  40  41  42  73  112 
99  64  65  66  67  68  69  70  71  72  111 
100 101 102 103 104 105 106 107 108 109 110
1
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
08.02.2019, 20:48  [ТС] 18
iSmokeJC, да, спасибо. Все верно. Просто, кажется, устал после рабочей недели. Проблема была лишь в том, что в Java нельзя использовать параметры по умолчанию (при объявлении списка параметров). Зачем я сюда приплел вообще статические переменные...Они здесь вообще не нужны
0
08.02.2019, 20:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2019, 20:48
Помогаю со студенческими работами здесь

Обновление переменной
При открытии пользователем сообщение имеющие уникальный идентификатор, желательно чтобы не видимо...

Обновление переменной сессии?
Не могу разрешить такую задачу: Необходимо такой скрипт: По до тех пор, пока не передана из...

Динамическое обновление значения переменной
Здравствуйте. Помогите решить проблему. &lt;select name='plspec'&gt; &lt;?php ...

Обновление переменной в catch не работает
Моя программа эмулирует работу пользователя в браузере с помощью селениума. В программа есть...


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

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