30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381

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

01.07.2017, 04:20. Показов 2072. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru