Рекурсия. Комбинация возможного бинарного кода - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Задачка, составить список комбинации с помощью рекурсии. Пример: 1)0110 0110 2)01x0 0100 0110 3) xx 00 01 10 11 4)101x100x11x 10101000110 10101000111 10101001110 10101001111 10111000110 10111000111 10111001110 10111001111
Ну или хотя бы сделать так, а дальше доработать: вводим кол-во чисел: 3 000 001 010 ... 110 111 Открыт для любых идеи
Ну или хотя бы сделать так, а дальше доработать: вводим кол-во чисел: 3 000 001 010 ... 110 111 Ну же, кто- нибудь! Придумал следующее: Переводить из 10 в 2
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
 
char * decToBin(int x)
{
    char *t = (char *)malloc(100);
    int i = 0;
    do
    {
        t[i++] = x % 2 + '0';
        x = x / 2;
    } while (x != 0);
    t[i] = '\0';
    // ??????????? t
    int k = strlen(t) - 2;
    int m = k / 2;
    for (int i = 0; i <= m; i++)
    {
        char tmp = t[i];
        t[i] = t[k - i + 1];
        t[k - i + 1] = tmp;
    }
    return t;
}
 
int main()
{
    int x,exp;
    scanf("%d", &exp);
    for( int x=0; x<pow(2,exp); ++x) {
    char *t = decToBin(x);
    printf("%s\n",t);
}
}
Но проблема в том, что первые числа не выводятся в формате, т.е. у меня так "0 1 10..." а нужно " 000 001 010..." и т.д. И подойдет ли этот алгоритм для решения задачи??

Решение задачи: «Рекурсия. Комбинация возможного бинарного кода»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void _perm(int* to_permute, int len, int* current_perm, int max_len);
void perm(int* list, int len){
 
  _perm(list, len, list, len);
}
 
void _perm(int* to_permute, int len, int* current_perm, int max_len){
  int i;
  
  if(len == 1){ 
    for(i = 0; i < max_len; i++){
      printf("%d ", current_perm[i]);
    }
    printf("\n");
  }
 
  
  else{
    for(i = 0; i < len; i++){
              /*создаю временную копию строки (temp) с той же самой длиной  
    устанавливаю первую  х в строке на '0';
    вызываю рекурсию проходящую в новую модифицированную строку temp 
 
        устанавливаю первую  х в строке на '0';
    вызываю рекурсию проходящую в новую модифицированную строку temp 
 
    вид вызовы рекурсии " _perm(to_permute + 1, len -1, current_perm, max_len);" */
    }
  }
}
 
int main(){
  int nums[10];
  scanf("%s", nums);
  int z = strlen(nums);
  perm(nums, z);
  return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем функцию _perm, которая принимает следующие параметры:
    • to_permute: указатель на массив, который нужно переставить
    • len: длина массива to_permute
    • current_perm: указатель на текущую перестановку массива
    • max_len: максимальная длина текущей перестановки
  3. Если len == 1, выводим текущую перестановку на экран
  4. В противном случае, создаем временную копию массива to_permute и присваиваем ей значение '0'
  5. Рекурсивно вызываем функцию _perm для новой модифицированной перестановки
  6. Устанавливаем первую позицию в текущей перестановке на '0'
  7. Рекурсивно вызываем функцию _perm для новой модифицированной перестановки
  8. Повторяем шаги 4-7 для каждого элемента массива to_permute
  9. Определяем функцию perm, которая принимает массив и его длину в качестве параметров
  10. Вызываем функцию _perm, передавая ей массив, его длину, указатель на текущую перестановку и максимальную длину текущей перестановки
  11. Вводим строку с помощью функции scanf
  12. Вычисляем длину строки
  13. Вызываем функцию perm, передавая ей введенную строку и ее длину
  14. Возвращаем 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы