Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381

Рекурсивный метод для решения задачи

01.07.2017, 04:20. Показов 2051. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2 точки координат, допустим расстояние между ними 200 метров.
Нужно добавить точки по 25 метров между этими 2-мя точками. И записать все точки в массив по порядку (от 1 до 2 точки).

p1______________________________________ ___________________________________p15

p1___p2___p3___p4___p5___p6___p7___p8___ p9___p10___p11___p12___p13___p14___p15__ _p16___p17

p9 = center(p1, p17)
p5 = center(p1, p9)
p3 = center(p1, p5)
p7 = center(p5, p9)
p2 = center(p1, p3)
p4 = center(p3, p5)
p6 = center(p5, p7)
p8 = center(p7, p9)
так же для правой части и записать в массив точки по порядку : p1,p2,p3,p4,p5...
Все это дело должно решатся рекурсией.
Кто понимает в рекурсиях помогите)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2017, 04:20
Ответы с готовыми решениями:

Метод решения задачи с jr на CRUD
Прайсы 2 CrUD для таблицы внутри файла Считать с консоли имя файла для операций CrUD Программа запускается с одним из следующих...

Подскажите литературу для решения задачи!
Добрый день! Подскажите, что можно прочитать для выполнения задания(вложенный файл). Желательно, что-нибудь простое для идиотов (меня :3)....

Подкиньте идею для решения задачи
Есть файл, который содержит вещественные(дробные) числа, разделенные пробелом. Например, "3.1415 3.22 555.1" и т.д. Округлить...

13
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
01.07.2017, 11:18
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
 
public class LineRec {
    private static class Point {
        private int pos;
 
        public Point(int pos) {
            this.pos = pos;
        }
 
        public int getPos() {
            return pos;
        }
 
        public boolean dist(Point p2) {
            return (Math.abs(p2.getPos() - pos) <= 25);
        }
 
        public void setPos(int pos) {
            this.pos = pos;
        }
 
        @Override
        public String toString() {
            return "P" + pos;
        }
    }
 
    private static void point(Point p1, Point p2, List<Point> list) {
        if ((Math.abs(p2.getPos() - p1.getPos()) < 25)) {
            return;
        }
        list.add(p1);
        point(new Point(p1.getPos() + 25), p2, list);
    }
 
 
    private static Point[] getPoints(Point p1, Point p2) {
        List<Point> list = new ArrayList<>();
        point(p1, p2, list);
        list.add(p2);
        return list.toArray(new Point[0]);
    }
 
 
    private static void point(int p1, int p2, List<Integer> list) {
        if (Math.abs(p2 - p1) < 25) {
            return;
        }
        list.add(p1);
        point(p1 + 25, p2, list);
    }
 
    private static int[] getPoints(int p1, int p2) {
        List<Integer> list = new ArrayList<>();
        point(p1, p2, list);
        list.add(p2);
        int[] points = new int[list.size()];
        for (int i = 0; i < points.length; i++) {
            points[i] = list.get(i);
        }
        return points;
    }
 
 
    public static void main(String[] args) {
        Point p1 = new Point(0);
        Point p2 = new Point(200);
        Point[] pPoints = getPoints(p1, p2);
        System.out.println(Arrays.toString(pPoints));
 
        p1.setPos(437);
        p2.setPos(852);
        pPoints = getPoints(p1, p2);
        System.out.println(Arrays.toString(pPoints));
 
        int[] iPoints = getPoints(0, 200);
        System.out.println(Arrays.toString(iPoints));
 
        iPoints = getPoints(437, 852);
        System.out.println(Arrays.toString(iPoints));
 
 
    }
}

Смотрите код.
На выходе массив с точками между указанными, расстояние больше или равно 25 метров.
Приведено два решения, на базе класса Point и просто на базе int значений.
На печать выводится номер позиции точки.
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
03.07.2017, 02:19  [ТС]
v777779, явно это ответ на вопрос.
Просто вопрос не тот).

Перепишем задачу: есть 2 точки координат (прямой отрезок). Нужно разбить его на отрезки по меньше (конкретно < 20 метров).
К координатам я не умею добавлять расстояние к примеру, 20 метров от точки, (если вы знаете как добавить 20 метров от точки зная направление, поделитесь, это очень облегчит работу), зато я умею находить центр между 2мя точками.
И потому решил делить отрезки на под отрезки и т.д. пока отрезок не будет меньше 20 метров и записать все точки в массив.
Это явно решается рекурсией, но еще так же важно записать полученные точки по порядку в массив.
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
03.07.2017, 19:20
Лучший ответ Сообщение было отмечено powowstal как решение

Решение

powowstal, возможно...
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
import java.util.ArrayList;
 
public class Points {
    public static void main(String[] args) {
        ArrayList<Double> points = new ArrayList<Double>();
        points.add(0.0);
        points.add(200.0);
 
        System.out.println("Current array contains: ");
        System.out.println(points);
        System.out.println();
 
        divideToBeLessThan20(points);
 
        System.out.println("New array contains: ");
        System.out.println(points);
    }
 
    private static void divideToBeLessThan20(ArrayList<Double> points) {
        if (points.get(1) - points.get(0) >= 20.0) {
            ArrayList<Double> leftSide = new ArrayList<Double>(),
                    rightSide = new ArrayList<Double>();
            Double average = (points.get(0) + points.get(1)) / 2;
 
            leftSide.add(points.get(0));
            leftSide.add(average);
 
            rightSide.add(average);
            rightSide.add(points.get(1));
 
            divideToBeLessThan20(leftSide);
            divideToBeLessThan20(rightSide);
 
            leftSide.remove(0);
            leftSide.remove(leftSide.size() - 1);
            rightSide.remove(rightSide.size() - 1);
 
            leftSide.addAll(rightSide);
            points.addAll(1, leftSide);
        }
    }
}
1
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.07.2017, 01:04  [ТС]
Керра, так писал но на выходе элементы стоят не по порядку
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
05.07.2017, 06:58
powowstal, не поняла. Моя программа выдает по порядку... Не поняла ваше сообщение...
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.07.2017, 19:27  [ТС]
Керра, ваш код работает правильно, раньше у меня не те данные на вход поступали.
Можете прокомментировать логику ? -
Цитата Сообщение от Керра Посмотреть сообщение
leftSide.add(points.get(0));
* * * * * * leftSide.add(average);
rightSide.add(average);
* * * * * * rightSide.add(points.get(1));
Цитата Сообщение от Керра Посмотреть сообщение
leftSide.remove(0);
* * * * * * leftSide.remove(leftSide.size() - 1);
* * * * * * rightSide.remove(rightSide.size() - 1);
leftSide.addAll(rightSide);
* * * * * * points.addAll(1, leftSide);
не могу понять как это работает.
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
05.07.2017, 19:34
Насчет первого: мы делим массив на два отдельных массива, у каждого из которых есть 2 элемента. То есть, мы берем середину, и эта середина является вторым элементом для левого массива, и первым элементом для второго массива.

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

Насчет points.addAll. Сначала мы соединяем левую и правую часть, затем удаляем лишние элементы, и добавляем левую (уже соединенную с правой) часть в изначальный массив, на место с индексом 1. То бишь, если у нас был массив (0, 200), то вставится на вторую (индекс 1) позицию, и получится (0, 50, 100, 150, 200). К примеру.
1
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.07.2017, 19:36  [ТС]
Керра, Изрядно помучившись вот что вышло
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   
 
main(){
MyPoints g = new MyPoints();
        myPoints.recurs(new LatLng(52.938719, 33.649940), new LatLng(52.943453, 33.666594));
}
 
 public  class MyPoints{
        public List<LatLng> mass = new ArrayList<>();//массив точек
    LatLng recurs(LatLng A, LatLng B){
        LatLng center = (new LatLng ((A.latitude+B.latitude)/2, (A.longitude+B.longitude)/2));//середина
        if(getDistanceBetweenPoints(A.latitude,A.longitude ,center.latitude,center.longitude)>20){//расстояние
 
            recurs(A,center);
 
            mass.add(center);
 
            recurs(center,B);
        }
    }
}
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
05.07.2017, 19:40
О господи боже мой ну и стиль у вас...

Добавлено через 23 секунды
Ща проверю...

Добавлено через 1 минуту
Киньте пожалуйста весь код, а не только main. MyPoints мне тоже нужно... У меня IDE сама отформатирует ваш ужас... Я извиняюсь...

Добавлено через 15 секунд
Киньте пожалуйста весь код, а не только main. MyPoints мне тоже нужно... У меня IDE сама отформатирует ваш ужас... Я извиняюсь...
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.07.2017, 19:55  [ТС]
Керра,
Java
1
2
3
4
5
        MyPoints myPoints  = new MyPoints();
        myPoints .recurs(new LatLng(50.505745, 30.600724), new LatLng(50.510965, 30.596272));
        for (LatLng l :myPoints .mass) {
            Log.i("MYMASS", "onCreate: "+l);
        }
так я запускаю на проверку + класс MyPoints что описан выше
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
05.07.2017, 19:59
Я говорю ВЕСЬ код нужен. Я знаю, что класс описан выше. Он мне тоже нужен для проверки.
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.07.2017, 21:36  [ТС]
Керра, ok 10 мин создам новый проект и залью на гид

Добавлено через 1 час 12 минут
Керра, на гид не судьба. В новом проекте код не запускается (библиотеки есть), видимо с настойками карты или ключ АПИ или студия обновилась криво. Скину архивом с гугла.
https://drive.google.com/open?... m1mR3ZnRDQ
Так всегда, как нужно что-то быстро сделать все перестает работать(

Добавлено через 3 минуты
Керра, оу, забыл проект на андроиде.

вот весь код:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import android.location.Location;
 
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
 
import android.util.Log;
 
import com.google.android.gms.maps.model.LatLng;
 
 
import java.util.ArrayList;
import java.util.List;
 
 
public class MapsActivity extends FragmentActivity {
 
    public  class MyPoints{
        public List<LatLng> mass = new ArrayList<>();
 
        LatLng recurs(LatLng A, LatLng B){
 
            LatLng center = (new LatLng ((A.latitude+B.latitude)/2, (A.longitude+B.longitude)/2));//середина
            if(getDistanceBetweenPoints(A.latitude,A.longitude ,center.latitude,center.longitude)>20){
 
                recurs(A,center);
 
                mass.add(center);
 
                recurs(center,B);
            }
 
            return center;
        }
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
 
        MyPoints myPoints = new MyPoints();
        myPoints.recurs(new LatLng(50.505745, 30.600724), new LatLng(50.510965, 30.596272));
        for (LatLng a :myPoints.mass) {
            Log.i("MYMASS", "onCreate: "+a);
        }
 
 
    }
    //разстояние между точками в метрах
    private float getDistanceBetweenPoints(double lat1, double lon1, double lat2, double lon2){
        Location loc1 = new Location("");
        loc1.setLatitude(lat1);
        loc1.setLongitude(lon1);
 
        Location loc2 = new Location("");
        loc2.setLatitude(lat2);
        loc2.setLongitude(lon2);
 
        float distanceInMeters = loc1.distanceTo(loc2);
        return distanceInMeters;
    }
 
 
}
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
06.07.2017, 07:20
powowstal, запустить не могу, но в целом формула правильная. Только концы не будут добавляться. И массив не чистится нигде - если второй раз с другими данными запустить, он в тот же будет добавлять, мешанина будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2017, 07:20
Помогаю со студенческими работами здесь

Разработайте классы для решения предложенной задачи
Разработайте классы для решения предложенной задачи. При необходимости, дополните существующие классы новыми методами. Все классы,...

Что нужно знать для решения данной задачи?
Что нужно знать, как организовать, с чего начать и т.д. и т.п.? Написать программу для поиска заданного текста в лог файлах. ...

Разработать программу на языке Java для решения следующей задачи:
Опишите класс отрезков на плоскости. Задайте функцию сравнения двух отрезков, а также функцию, проверяющую, пересекаются ли отрезки в...

Метод простых итераций для решения нелинейных уравнений на Java
Пишу код. Вроде все ок, но ничего не работает, точнее работает, но не корректно. Использовала как пример код на с++. Может у кого есть...

Метод Гаусса для решения системы уравнений. Перевести с Pascal
Прошу помощи. Нашёл код в интернете, попробовал написать его на java. Но дело в том, что массивы в Java создаются с 0. А в коде...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru