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

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

01.07.2017, 04:20. Показов 2027. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru