Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 18:56   #1
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию Двоичный поиск

Помогите написать рекурсивный двоичный поиск на Си.
Код:
#include <stdio.h>
#include <stdlib.h>
int search(int *left, int nel, int k)
{
    int *p;
    if (*left>*(left+nel*sizeof(int))) return -1;
    if (*left==*(left+nel*sizeof(int))) if (*left==k) return *left; else return -1;
    if (*left<*(left+nel))
     {
         *p=(*left+*(left+nel*sizeof(int)))/2;
         if (k==*p) return *p;
         else if(k<*(*left+p)) return(search(*left,*p,k)) ;
         else return(search(*p,*left,k));
     }


}
int main()
{
    int mas[]={10,20,35,44,55,62,73,81,95,105};
    int find=105;
    printf("%d",search(mas,10,find));
    return 0;
}
*left указатель на массив, nel количество элементов, k элемент который нужно найти. Пожалуйста или помогите исправить программу или подскажите как её переписать заново.
mikebrownen вне форума Ответить с цитированием
Старый 22.09.2011, 18:56   #2
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

у меня прога все время выводит минус один.
mikebrownen вне форума Ответить с цитированием
Старый 22.09.2011, 21:15   #3
datMaster
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 20
По умолчанию

Код:

#include <stdio.h>
#include <stdlib.h>
int search(int *left, int nel, int k, int i)
{
    if (i == nel)
        return -1;
    if (left[i] == k)
        return ++i;
    else 
        search(left, nel, k, ++ i);
}
int main()
{
    int mas[]={10,20,35,44,55,62,73,81,95,105};
    int find=105;
    printf("%d",search(mas,10,find, 0));
    return 0;
}
datMaster вне форума Ответить с цитированием
Старый 22.09.2011, 21:31   #4
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

нужно чтобы всегда было только 3 параметра в функции
mikebrownen вне форума Ответить с цитированием
Старый 22.09.2011, 22:17   #5
datMaster
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 20
По умолчанию

Код:

#include <stdio.h>
#include <stdlib.h>

int num(int *data)
{
    int i = 0;
    while (data[i] != '\0')
        ++ i;
    return i;
}

int search(int *left, int k, int i)
{
    if (i == num(left))
        return -1;

    if (left[i] == k)
        return ++i;
    else 
        search(left, k, ++ i);

      
}
int main()
{
    int mas[]={10,20,35,44,55,62,73,81,95,105};
    int find=105;
    printf("%d",search(mas,find, 0));
    return 0;
}
datMaster вне форума Ответить с цитированием
Старый 22.09.2011, 22:35   #6
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

Я может быть чего то не понимаю,но у вас идет просто приближение постепенное к границе числа, а не поиск делением пополам!
mikebrownen вне форума Ответить с цитированием
Старый 22.09.2011, 22:50   #7
datMaster
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 20
По умолчанию

пардон, думал надо рекурсию написать

Код:

#include <stdio.h>
#include <stdlib.h>

int num(int *data)
{
    int i = 0;
    while (data[i] != '\0')
        ++ i;
    return i;
}

int search(int *left, int k, int i)
{        
    if (i == num(left)|| (i == -1))
        return -1;
    if (left[i] == k)
        return ++ i;
    else 
        if (left[i] > k)
            search(left, k, -- i);
        else
            search(left, k, ++ i);      
}
int main()
{
    int mas[]={10,20,35,44,55,62,73,81,95,105};
    int find=105;
    printf("%d",search(mas,find, 5));
    return 0;
}
datMaster вне форума Ответить с цитированием
Старый 22.09.2011, 22:56   #8
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

а что нибдуь про вот это можете сказать? http://www.programmersforum.ru/showthread.php?t=165816 я там привел в конце окончательный код
mikebrownen вне форума Ответить с цитированием
Старый 22.09.2011, 23:07   #9
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

У вас же в этой задаче массив все равно пополам не делится!!! И в решении вообще не должно быть циклов
mikebrownen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двоичный код vereney Паскаль, Turbo Pascal, PascalABC.NET 0 30.03.2011 19:42
Двоичный поиск в массиве структур vistaman1 Общие вопросы C/C++ 2 28.05.2010 17:30
Двоичный поиск в Turbo C++ 3.0 Xeon332 Помощь студентам 3 29.01.2009 04:19
Двоичный поиск элемента в массиве (Си под DOS) Zid@ne Общие вопросы C/C++ 7 24.12.2008 18:07
Двоичный код masterx13 Паскаль, Turbo Pascal, PascalABC.NET 4 14.11.2007 20:08