Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2

Рекурсия в различных компиляторах

27.07.2011, 22:29. Показов 3382. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Задача: дано целое число n, нужно получить его битовое представление, развернуть его, и то, что получилось перевести обратно в десятичную систему счисления.
Пример:n = 4, ответ - 1
n = 6, ответ - 3.
Решил ее через циклы, прошла все тесты, поэтому решение меня не интересует.
Также написал красивую на мой взгляд рекурсию, которая отлично работает на gcc.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
int n, k;
int f(int n){
    return n ? f(n / 2) + n % 2 * pow(2., k++) : 0;
}
int main(){
    int n = 6;
    std::cout << f(n);
}
Но, VC++ этот код неправильно понимает(просто выводит назад это же число).
Собственно, вопрос - что в моей рекурсии неоднозначно? И как ее можно исправить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2011, 22:29
Ответы с готовыми решениями:

Getline в различных компиляторах
Добрый день. Такой вопрос. В одном компиляторе в этом участке кода проблем нет, а в visual studio компилятору не нравится 9-ая строчка, а...

Количество различных цифр в числе рекурсия
для натурального n вывести количество разных цифр, участвовавших в его записи. Помогите составить рекурсивную функцию, я плохо...

Рекурсия: напечатать все перестановки n различных чисел
Дано n различных натуральных чисел. Напечатать все перестановки этих чисел с использованием рекурсии. Используется ли в этой программе...

31
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
28.07.2011, 10:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
а ниче что в памяти они все двоичные ???
Так вы на условие задачи посмотрите. Здесь более точный вариант условия. Перегнать число из десятичной в двоичную СС и обратно ничего не стоит, хекс здесь лишний.

Цитата Сообщение от ValeryS Посмотреть сообщение
а в процессоре ты тоже запретишь лишние разряды???
А при чем здесь процессор? Двоичную СС не только в нем можно использовать =)


Цитата Сообщение от ValeryS Посмотреть сообщение
если мне надо перевести 20 чисел я должен писать 20 программ?
Одну, но хорошую =)
Передо мной стояла задача не написать универсальную и читабельную программу, а решить простенькую задачу минимальным количеством символов. Среди цппшников я, в общем-то, первый.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
28.07.2011, 10:44
Цитата Сообщение от grizlik78 Посмотреть сообщение
Но задача специфическая.
для переворота байта (слова ) достаточно распространенная удивляюсь что в стандартные библиотеки не встроили (или где то есть)?
но в таком варианте

Цитата Сообщение от diagon Посмотреть сообщение
0110 = 110
Реверснутый вариант - 011 = 11 = 3 в десятичной
потому получается
Цитата Сообщение от ValeryS Посмотреть сообщение
1,2,4,8 равно 1
3,6,С равно 3
7 Е равно 7
взял полубайты (вообше ответов куда больше)
я не знаю где она может пригодится

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Перегнать число из десятичной в двоичную СС и обратно ничего не стоит
что значит перегнать???
вывести на экран(принтер)?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
28.07.2011, 10:47  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
что значит перегнать
Получить массив нуликов/еденичек, который и нужно реверснуть, а потом реверснутый вариант перегнать обратно в десятичную СС.
Но со стеком рекурсии более красивое и короткое решение получается.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 15:50
При использовании глобальных переменных все гораздо проще получается:
C++
1
2
3
4
5
6
7
8
9
10
int k = 0;
 
int f(int d)
{ int b = d % 2;
  if(d > 0)
  { k = (k * 2 + b);
    int r = f(d/2); 
  }
  return k;   
}
И никаких pow()
Попробуйте без глобальных переменных - это гораздо интереснее...
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
28.07.2011, 15:55  [ТС]
Можно еще проще(ну во всяком случае короче):
C++
1
2
3
4
int n, k;
int f(int n){
    return n ? f(n / 2) + n % 2 * (1 << k++) : 0;
}
У паскалистов на 4 символа короче =(
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
29.07.2011, 00:25
Не уверен, что правильно понял, но вот чего набыдлокодил...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <limits.h>
 
#define INT_BITS (CHAR_BIT * sizeof(int))
 
void bindump(unsigned val){
    int i = INT_BITS;
    
    while ( i )
        printf("%d", (val >> --i) & 1);
    printf("\n");
}
 
unsigned bit_reverse(unsigned val, size_t pos){
    return ( pos > 1 ) ? (bit_reverse(val, pos - 1) << 1) | ((val >> (pos - 1)) & 1) : val & 1;
}
 
int num_reverse(int num){
    return (int)bit_reverse((unsigned)num, INT_BITS);
}
 
int main(void){
    int num, rev;
    
    while ( printf("Number: ") && scanf("%d", &num) == 1 ){
        printf("DEC: %11d\tBIN: ", num);
        bindump(num);
        rev = num_reverse(num);
        printf("DEC: %11d\tBIN: ", rev);
        bindump(rev);
    }
    
    return 0;
}
Миниатюры
Рекурсия в различных компиляторах  
2
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
29.07.2011, 09:43
easybudda, да. Это хороший подход - реверсить строку битов.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.07.2011, 12:22
Рекурсия это конечно здорово, но сам реверс битов делается вот так:
C
1
2
3
4
5
6
unsigned bitrev(unsigned x) {
   x = (x & 0x55555555) <<  1 | (x >>  1) & 0x55555555; 
   x = (x & 0x33333333) <<  2 | (x >>  2) & 0x33333333; 
   x = (x & 0x0F0F0F0F) <<  4 | (x >>  4) & 0x0F0F0F0F; 
   x = (x << 24) | ((x & 0xFF00) << 8) | ((x >> 8) & 0xFF00) | (x >> 24); 
   return x;
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
29.07.2011, 12:51
fasked, здесь предполагается, что размер целого равен 32 битам, 4 байтам. Это не везде так... При изменени размеров целого придется дописывать функцию. А в рекурсивной версии - нет.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.07.2011, 13:19
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
здесь предполагается, что размер целого равен 32 битам, 4 байтам. Это не везде так... При изменени размеров целого придется дописывать функцию. А в рекурсивной версии - нет.
Это да, но я не могу представить себе программы, где приходится заниматься реверсом битов и в которой заранее нет четкого представления о настолько низком уровне. То есть задача явно либо олимпиадная, либо для программирования каких-нибудь железяк, а уж там то все строго. Ну и конечно скорость и потребление памяти по сравнению с рекурсией.
То есть за все надо платить
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
29.07.2011, 13:22
fasked, не... Вспомните big-endian и little-endian.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.07.2011, 13:38
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Вспомните big-endian и little-endian.
Ну а разве это не низкий уровень? Есть четкая документация, как работает железка или спецификация протокола. Все следуют подобной документации и ... я не думаю, что возможны какие-либо значительные изменения в будущем, а введение дополнительного слоя абстракции легко позволит избежать проблем при появлении незначительных изменений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2011, 13:38

Рекурсия: число различных путей для насекомого из начальной точки поля в конечную
Снова нужна помощь специалистов Представь насекомое на клечатом поле размера M x N . Насекомое стартует из нижнего левого угла (0,...

Рекурсия: дано n различных натуральных чисел (n = 5). Напечатать все перестановки этих чисел
Дано n различных натуральных чисел (n = 5). Напечатать все перестановки этих чисел. Очень нужна помощь

Способы распределение a различных бананов, b различных яблок и c различных груш
Влад хочет взять с собой для ланча пару фруктов. У него есть a различных бананов, b различных яблок и c различных груш. Сколькими способами...

Есть ли разница в компиляторах?
на все коды ругается этот компилятор (Borland C++ 3.1). Может там есть какие то свои спец настройки?

Разный вывод в разных компиляторах
Всех с наступающей весной!) Проблема такая, вот этот код: int main() { long double n, itog = 0, sumsin = 0; cin &gt;&gt; n; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru