#c
#c
Вопрос:
#include <iostream>
int find(int *a, int l, int r, int value)
{
if (l <= r)
{
int mid=(l r) / 2;
if (a[mid] == value)
return mid;
find(a, l, mid-1, value);
find(a, mid 1, r, value);
}
return -1;
}
int main()
{
int a[30] = {1,3,5,7,9,12,25,56,90,81,101,
106,120,130,4,6,200,17,18,19,20,
12,456,4325,6507,59,69,58,384,299};
int size = 30;
int k = 3;
int pos = -1;
std::cout << "Can find " << k << " in position " << find(a, 0, size - 1, k) << "n";
return 0;
}
Как я могу разбить рекурсивный?
Это поиск разделов, который не отсортирован, но когда он нашел рекурсивный ответ, не останавливающий его, приводит к неправильному ответу.
Комментарии:
1. Вы не используете значение ваших рекурсивных вызовов…
Ответ №1:
Вы забываете использовать результат ваших рекурсивных вызовов, это должно быть что-то вроде:
int find(int *a, int l, int r, int value)
{
if (l <= r)
{
int mid = (l r) / 2;
if (a[mid]== value) { return mid; } // Found
if (int res = find(a, l, mid - 1, value); res != -1) { return res; }
if (int res = find(a, mid 1, r, value); res != -1) { return res; }
}
return -1; // Not found
}
Ответ №2:
Вы забыли поставить return перед рекурсивными вызовами:
int find(const int *a,const int l,const int r,const int value)
{
if(l<=r)
{
const int mid=(l r)/2;
if(a[mid]== value)
return mid;
const int result = find(a,l,mid-1,value);
if (result == -1)
return find(a,mid 1,r,value);
else
return resu<
}
return -1;
}
Но в этом случае ваш поиск всегда будет сначала искать левую сторону, что в точности соответствует линейному поиску.