Member 13986668 Ответов: 2

Как сделать эту программу


как описано ниже.
Сначала пользователю предлагается ввести число от 1 до 1024. Определяемая пользователем функция
следует проверить входное значение пользователя. Если значение не находится в диапазоне от 1 до 1024, то возникает ошибка
сообщение должно быть отображено.
Во-вторых, рекурсивная функция ищет входное значение пользователя систематическим методом и
печатает все предполагаемые значения во время процесса. Рекурсивная функция находит число как
показано ниже с его предполагаемыми значениями.
Предположим, пользователь вводит 625. Затем программа печатает свои предполагаемые значения во время поиска
входное значение пользователя, как показано ниже.
1024,
512,
768,
640,
576,
608,
624,
632,
628,
626,
625

Предположим, пользователь вводит 300. Затем программа печатает свои предполагаемые значения во время поиска
входное значение пользователя, как показано ниже.
1024,
512,
256,
384,
320,
288,
304,
296,
300

Что я уже пробовал:

#include <iostream>
#include <math.h>
int search(int num);
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int sum=0;
int main(int argc, char** argv) {
	int x;
	cout <<"enter number between 0 to 1024 ";
	cin>>x;
	search(x);
	
	return 0;
}
int search(int num){
	int p=num;
	if(sum!=num){
		for(int i=0;i<100;i++){
			if(sum<num){
			sum=1024/2*pow(2,i)+sum;
			cout<<sum<<endl;
		}else{
			sum=1024/(2*pow(2,i))-sum;
			cout<<sum<<endl;
		}
		
		
	}return search(sum);
}else{
	return 1;
}
}

2 Ответов

Рейтинг:
4

OriginalGriff

Это простая бинарная отбивная: Алгоритм бинарного поиска - Википедия[^] - один из самых основных способов "сужения" на неизвестное значение в диапазоне.
Вы начинаете с максимальных и минимальных возможных значений, и вы угадываете на полпути между ними.
Если значение больше половины, то минимум становится половиной.
Если это то же самое, вы нашли его.
если она меньше половины, то максимум становится половиной
Повторяйте, пока не найдете.

Поворот здесь заключается в том, что ваша домашняя работа требует, чтобы она была рекурсивной (что является довольно плохим примером рекурсии, но эй! Вот тебе и домашнее задание!)

И я бы добавил тест к вашему коду, чтобы проверить, что пользовательский ввод находится в диапазоне...


Рейтинг:
20

Member NFOC

Это пример алгоритма бинарного поиска, в котором вы берете максимальное и минимальное значение и переходите к полпути. Если значение все еще больше искомого значения, то минимум становится наполовину и меньше половины, максимум становится наполовину.
Вы должны попробовать это, это весело, и есть эта рекурсия, чтобы немного покрутить ее. Но в конце концов это просто рекурсия и еще кое-что.