2009-11-30 5 views
0

Я делаю курс C. Мне нужно сделать рекурсивный двоичный файл XOR, но у меня есть некоторые ограничения. Я не могу использовать петлю или любые функции math.h, а также не могу вызвать другую функцию из функции XOR.Рекурсивная двоичная функция с десятичной функцией без pow() или петель

Это прототип функции:

int binaryXor(int firstnumber[], int secondnumber[], int length); 

где firstnumber и массивы второго числа с одинаковой длиной 1 и 0 и длиной их длина.

Функция должна возвращать десятичное значение XOR этих двух массивов. Выполнение XOR довольно просто, но как я могу преобразовать его в десятичный со всеми ограничениями?

+0

Эта функция не возвращает «десятичное значение» чего-либо, он возвращает Int. –

+0

Логически можно обрабатывать каждый элемент массива без процесса, являющегося циклом? –

+0

В контексте назначения курса я уверен, что если вам говорят написать «рекурсивную функцию» и что вы «не можете использовать циклы», это означает, что рекурсивный вызов не является циклом. Вы можете или не согласны с этим определением цикла, но я уверен, что здесь это означает любую конструкцию цикла процедур. –

ответ

2

Это стандартный рекурсивный вопрос. Трюк заключается в том, чтобы понять, что целочисленное значение a строки из 1s и 0s, за которой следует 1 или 0, равно 2 * целочисленному значению строки плюс значение цифры.

Так что вы хотите сделать что-то вроде

if(length <= 0) return 0; 

return 2 * binaryXOR(firstnumber, secondnumber, length - 1) + (firstnumber[length - 1]^secondnumber[length - 1]); 
+1

Каков относительный приоритет «+» и «^»? Итак, почему ваше выражение дает неправильный ответ? Используйте скобки (круглые скобки) при смешивании арифметических и побитовых операций! –

+0

Спасибо Джонатан. Обычно я не тестирую эти домашние задания. ОП может узнать что-то по моим ошибкам! – UncleO

+0

Большое спасибо, ты мне очень помог. – Ariel

0

Рекурсивный вызов функции может использоваться вместо цикла.

+0

Правда - я ненавижу подобные проблемы. Кто бы мог использовать рекурсию для итерации по массиву? –

+2

В C никто. В функциональных языках все. Так что да, школа должна научить рекурсию либо функциональным языком, либо более естественным примером. Но рекурсия, которая не является тривиально сводимой к циклу, не является хвостовой рекурсивной, и проблемы, которые не могут быть сделаны хвостовыми рекурсивными, могут быть немного выше уровня курса на ранней стадии, где вводится рекурсия.По крайней мере, я предполагаю, что это мышление, которое приводит к тому, что они «делают что-то, чего вы никогда не делали, просто для иллюстрации целей». –

3

Для того, чтобы написать рекурсивную функцию, без петель, необходимо ответить на следующий вопрос: «Как я могу выразить ответ на мою проблему с точки зрения меньшей проблемой»

В этом случае проблема заключается в том, что у вас есть цифры length, на которые вы можете посмотреть, но вам не разрешено зацикливаться. Итак, как вы выражаете xor размера length с точки зрения меньшего xor, а также некоторого количества работы, которая не требует цикла?

[Изменить: висеть, просто посмотрел на ваш вопрос снова, и вы говорите, что у вас уже есть сортировка xor, поэтому, я думаю, вы уже это сделали. В этом случае мой комментарий выше - это единственное, что вам нужно знать: вы закончили. Значение int в C не является десятичным значением, это просто значение. Вам не нужно конвертировать ничего в десятичное, чтобы сохранить или вернуть его в int.

Если вам интересно, я могу отправить код, который преобразует int в десятичное значение, используя рекурсивную функцию. Один простой способ - это поработать на пути «вниз», сколько цифр требуется, сравнивая с большей и большей мощностью 10, а затем на обратном пути «вверх» печатайте цифры, начиная с конца.]