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

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

Восстановить пароль Регистрация
 
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
03.10.2013, 14:25     Прерывание работы рекурсионной функции типа void #1
Есть рекурсионная функция, имеющая нечто общее с функцией ниже:

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, помеченный звездочкой, должен выкинуть меня из функции, этого не происходит, и каким -то неведомым мне образом, сортировка еще несколько раз вызывается.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2013, 14:25     Прерывание работы рекурсионной функции типа void
Посмотрите здесь:

C++ Функции типа void
аналог break для функции типа void C++
C++ Данные типа void*
C++ В чем особенность функции типа void от других типов?
Задача с использованием функции типа void и указателей, как параметров функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.10.2013, 15:31     Прерывание работы рекурсионной функции типа void #2
по-моему, для qsort тут многовато кода.
Дело явно не только в return. Всматриввайся в остальные 30 строчек
iifat
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,692
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
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,692
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++ LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain
Как вводить функции типа void C++
C++ Прерывание работы функции, если при введенных значения вычисление невозможно

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

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

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