Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
#1

Прерывание работы рекурсионной функции типа void - C++

03.10.2013, 14:25. Просмотров 408. Ответов 7
Метки нет (Все метки)

Есть рекурсионная функция, имеющая нечто общее с функцией ниже:

C++
1
2
3
4
5
6
7
8
9
void function test(int b)
{
int a;
a = b;
a++;
if (a == 10)
     return;
test(a);
}
Так вот, почему-то моя функция не прерывается ретурном..

вот мой код:
C++
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
void quick_sort_helper(int *sf_mass,int in, int out, int n) //на вход (массив, номер 1го, номер N-го, размер массива)
{
    int a,b,p,mid, size;
    size = out - in;
    a = in;
    b = out - 1;
    mid = out;
    if ((size) < 1)
        return ;
    if (((size) == 1)&&(b == (n-1))) // (*)
    {
        std::cout<<"b = "<<b<<std::endl;
        return ;
    }
    else
    {
    p = sf_mass[mid];
    do
    {
        while (sf_mass[a] < p) a++;
        while ((sf_mass[b] > p)&&(b > in)) b--;
        
        if (a<b)
        {
            apmath_easyfunc::swap_int(&(sf_mass[a]),&(sf_mass[b]));
        }
    }   while (a<b);
    if (sf_mass[a] > sf_mass[mid])
        apmath_easyfunc::swap_int(&(sf_mass[a]),&(sf_mass[mid]));
    if (b > in) quick_sort_helper(sf_mass, in, b, n);
    if (a < n) quick_sort_helper(sf_mass, a, n, n);
    }
}
по идее, когда указатель а доходит до N-го элемента, if, помеченный звездочкой, должен выкинуть меня из функции, этого не происходит, и каким -то неведомым мне образом, сортировка еще несколько раз вызывается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
03.10.2013, 15:31     Прерывание работы рекурсионной функции типа void #2
по-моему, для qsort тут многовато кода.
Дело явно не только в return. Всматриввайся в остальные 30 строчек
iifat
2186 / 1339 / 98
Регистрация: 05.06.2011
Сообщений: 3,706
03.10.2013, 15:50     Прерывание работы рекурсионной функции типа void #3
Цитата Сообщение от Greeezly Посмотреть сообщение
C++
18
19
20
21
22
23
24
25
26
27
do
{
    while (sf_mass[a] < p) a++;
    while ((sf_mass[b] > p)&&(b > in)) b--;
 
    if (a<b)
    {
        apmath_easyfunc::swap_int(&(sf_mass[a]),&(sf_mass[b]));
    }
} while (a<b);
Вот тут может возникнуть бесконечный цикл, если массив с повторами: уткнулись в два элемента, равных p, поменяли их местами, снова уткнулись и так до бесконечности.
Касательно основного вопроса — поставь отладочную печать. Например, в начало функции исходный массив и индексы, перед выходом — снова. И выложи логи.
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
04.10.2013, 08:31  [ТС]     Прерывание работы рекурсионной функции типа void #4
Равных элементов быть не может, этот вариант базовой быстрой сортировки не поддерживает повторяющихся значений.

Добавлено через 18 минут
По отладке видно, что сортировка сначала движется влево (b> in) затем вправо до конца. И все корректно. Но! Когда сорт доходит до крайнего правого элемента, она начинает двигаться в обратном направлении по отсортированному массиву где-то до середины, затем снова к N-му элементу.

***************
**************
******
***
*
-**************
--*************
---************
----***********
. . .

--------------****
---------------***
----------------**
-----------------*
-----------------*
---------------**
--------------***
-------------****
------------*****
----------******
---------*******
----------******
-------------****
--------------***
---------------**
----------------*
---------------**
--------------***
. . .

Я так понимаю, что прерывает цикл сама Visual studio. В конце массив выводится отсортированным.

функция вывода стоит где-то между 2-8 строками

Добавлено через 4 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по-моему, для qsort тут многовато кода.
ну тут еще присутствует обработка некоторых гран условий + пропуски + можно не вводить некоторые переменные и записать компактнее, вот и получится объем qsort базовой версии.
iifat
2186 / 1339 / 98
Регистрация: 05.06.2011
Сообщений: 3,706
04.10.2013, 16:40     Прерывание работы рекурсионной функции типа void #5
Это всё на уровне размахивания руками. Полный лог, плз. Операнды и массив на входе, массив на выходе.
Смутно ощущаю, что если массив упорядочен, то к строке 30 будет http://www.cyberforum.ru/cgi-bin/latex.cgi?a=b+1 и что из того выйдет — не знаю. Как и, кстати говоря, если http://www.cyberforum.ru/cgi-bin/latex.cgi?out-in=1, но http://www.cyberforum.ru/cgi-bin/latex.cgi?b\ne n-1 — после строк 5, 6 a, b совпадут, что не есть хорошо.
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
15.10.2013, 12:52  [ТС]     Прерывание работы рекурсионной функции типа void #6
Вот скрины

То что видно на 2й картинке, на самом деле еще неск. раз повторяется
Миниатюры
Прерывание работы рекурсионной функции типа void   Прерывание работы рекурсионной функции типа void  
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
16.10.2013, 10:35  [ТС]     Прерывание работы рекурсионной функции типа void #7
iifat, что вы можете сказать по этому поводу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 09:47     Прерывание работы рекурсионной функции типа void
Еще ссылки по теме:

C++ Указатель типа void c++
Функции ввода и вывода массива произвольного типа через void C++
Функции, ошибка C2562: tabl: функция типа "void", возвращающая значение C++
Указатель типа void C++
Динамический массив типа void C++

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

Или воспользуйтесь поиском по форуму:
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
20.11.2013, 09:47  [ТС]     Прерывание работы рекурсионной функции типа void #8
Никто не сможет помочь?(
Yandex
Объявления
20.11.2013, 09:47     Прерывание работы рекурсионной функции типа void
Ответ Создать тему
Опции темы

Текущее время: 18:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru