Использование рекурсии вместо цикла

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
alina44
Сообщения: 1
Зарегистрирован: 06 янв 2016, 19:20

Помогите, пожалуйста!
Нужно использовать рекурсию вместо цикла:

Код: Выделить всё

#include <iostream>
using namespace std;
int a[100], b[100], n;
 
int digit(int n, int p)
{
    return (n >> p & 1);
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int k = sizeof(int);
    for(int i = 0; i < k; i++)
    {
        int c[2] = {0};
        for(int j = 0; j < n; j++)
            c[digit(a[j],i)]++;
        for(int j = 1; j < 2; j++)
            c[j] += c[j - 1];
        for(int j = n - 1; j > -1;j--)
            b[--c[digit(a[j],i)]] = a[j];
        for(int j = 0; j < n; j++)
            a[j] = b[j];
    }
    for(int i = 0; i < n; i++)
        cout << a[i] <<endl;
    return 0;
}
Пыталась переделать, но что-то пошло не так... и теперь ничего не сортируется

Код: Выделить всё

#include <iostream>

void Input(int n, int t, int* &arr){
	std::cout << "Enter " << n+1 << " element: " << std::endl;
	std::cin >> arr[n];
	if (n < t - 1) Input(++n, t, arr);
}

void Output(int n, int t, int* arr){
	std::cout << "arr[" << n + 1 << "]=" << arr[n] << std::endl;
	if (n < t - 1) Output(++n, t, arr);
}

void Counter(int countofbits, int n, int t, int* arr, int &count0){
	if (arr[n] >> countofbits & 1 == 0)
		count0++;
	if (n < t - 1) Counter(countofbits, ++n, t, arr, count0);
}

void Sort(int i, int t, int* arr, int* &mirrow, int countofbits, int &count0, int &count1){
	mirrow[--((arr[i] >> countofbits & 1 == 0) ? (count0) : (count1))] = arr[i];
	if (i > 0) Sort(--i, t, arr, mirrow, countofbits, count0, count1);
}

void Rewriting(int i, int t, int* &arr, int* mirrow){
	arr[i] = mirrow[i];
	if (i < t - 1) Rewriting(++i, t, arr, mirrow);
}

void Foundation(int countofbits, int t, int* &arr){
	int count0, count1;
	count0 = 0;
	count1 = t;
	Counter(countofbits, 0, t, arr, count0);
	int* mirrow = (int*)malloc(t*sizeof(int));
	Sort(t-1, t, arr, mirrow, countofbits, count0, count1);
	Rewriting(0, t, arr, mirrow);
	if (countofbits < 8*sizeof(int)) Foundation(++countofbits, t, arr);
}

int main() {
	int t;
	std::cout << "Enter n: " << std::endl;
	std::cin >> t;
	int* arr = (int*)malloc(t*sizeof(int));
	Input(0, t, arr);
	Foundation(0, t, arr);	
	Output(0, t, arr);
	system("pause");
	return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Честное слово, пытался разобрать, что делает первый вариант программы, но сломал себе голову. Наверное, если его отдебажить, то можно как-то это осознать, но у меня нет столько свободного времени.

А ещё очень смущает, что j бежит как бы по байтам каждого элемента массива (так как sizeof(int) - это количество байт в типе int), но при этом значение j используется, для смещения по битам. Хоть я не понимаю целиком алгоритм, но это несоответствие уже настораживает.

Если объяснишь, что делает первый вариант программы, обещаю помочь разобраться, что не так во втором.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Честное слово, пытался разобрать, что делает первый вариант программы, но сломал себе голову.
не мудрено. Алина, что за суперхитрость в цикле

Код: Выделить всё

for(int j = 1; j < 2; j++)
?
Пыталась переделать, но что-то пошло не так... и теперь ничего не сортируется
Так и раньше не сортировалось.
А ещё очень смущает, что j бежит как бы по байтам каждого элемента массива (так как sizeof(int) - это количество байт в типе int), но при этом значение j используется, для смещения по битам.
Вот только sizeof - это k, а n вводится с клавы.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Вот только sizeof - это k, а n вводится с клавы.
Опечатался. Имелось в виду i, а не j. Переменная i бежит от нуля до k, то есть по байтам. А потом передаётся в функцию digit, где используется для битового смещение. Несоответствие настораживает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Да у него вообще нагромождение чёрт знает чего.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить