2016-10-19 4 views
-1

Я довольно новичок в C++. Я пытаюсь написать рекурсивную двоичную функцию. Бинарный вывод должен быть 4 бита, следовательно, логика около 15 и длина двоичной строки. Он правильно преобразуется в двоичный файл, проблема, с которой я столкнулась, заканчивается рекурсивным вызовом и возвращает двоичную строку главной функции. Кажется, это просто назад через стек вызовов? Может кто-нибудь помочь мне понять, что происходит?Рекурсивное двоичное преобразование C++

Предполагая использование пространства имен std. Я знаю, что это не очень хорошая практика, но это необходимо для моего курса.

string binary(int number, string b){ 
    if (number > 0 && number < 15){ 
     int temp; 
     temp = number % 2; 
     b = to_string(temp) + b; 
     number = number/2; 
     binary(number, b); 
    } 
    else if (number > 15){ 
     b = "1111"; 
     number = number - 15; 
     binary(number, b); 
    } 
    else if (number == 15){ 
     b = "11110000"; 
     return b; 
    } 
    //should be if number < 1 
    else{ 
     int s = b.size(); 
     //check to make sure the binary string is 4 bits or more 
     if (s >= 4){ 
      return b; 
     } 
     else{ 
      for (int i = s; i < 4; i++){ 
       b = '0' + b; 
      } 
      return b; 
     } 

    } 
} 
+0

Вы должны сделать что-то с возвращаемым значением из 'binary (number, b);' но я не уверен, что. Более подробное описание того, что должен делать этот код, ожидаемые результаты для данных входов и [mcve], пожалуйста. – user4581301

+0

Что такое базовый регистр для рекурсии? –

ответ

0

У вас есть функция, возвращающая строку, а затем вам требуется пользователю предоставить инициализацию строку для вас, и вы выбрасываете возвращаемое значение для базовых случаев 15 и 0. В остальной части, за исключением время, ваше фактическое сообщение использует параметр b. Эта множественная связь вызовет некоторые головные боли.

Я также отмечаю, что вы возвращаете правильно заполненное 4-битное число в нормальных случаях; однако вы возвращаете 8-битный для точного значения 15. Является ли эта часть спецификации назначения?

Логика для больших чисел является странной: если сумма больше 15, вы возвращаете «1111», добавленную к представлению для остатка. Например, 20 вернется как двоичный (5), за которым последуют «1111» или «1011111», что явно неверно. Даже незнакомец, кажется, что любой, кратный 15, вернет «11110000», поскольку этот пункт (== 15) перезаписывает любое предыдущее значение b.

Предлагаю вам проанализировать и упростить логику. Там должно быть два случая:

  • (БАЗА) Если число == 0, возвращение '0'
  • (RECUR) возвращение [ '1' (для нечетного) еще '0'] + бинарный (число/2)

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

Вы путешествуете?

+0

Да, спасибо! Теперь я сохраняю b, и он работает правильно. –

+0

Что касается логики для двоичных чисел, это правильная логика, основанная на задании, но спасибо за советы! –

+0

Отлично! Не забудьте принять ваш любимый ответ, поэтому Stack Overflow может правильно уйти с вопроса ... даже если вам нужно написать его самостоятельно. – Prune

Смежные вопросы