2014-10-20 2 views
1

Позвольте мне начать с того, что я не ищу, чтобы кто-то сделал это для меня. Я надеюсь на намек или предложение.Использование рекурсии для печати строк в C

Я знаю, что есть более умный способ сделать это. Код размещен ниже. Я пытаюсь напечатать план. Мой код работает до глубины 3. (Глубина - это количество подразделов, поэтому 3 будет секцией 1, раздел 1.A и разделом 1.A.1). Он также работает для ширины (количество разделов и каждого типа подраздела) из 26, где он ограничен. Однако, чтобы получить большую глубину, это будет включать в себя гораздо больше циклов. Мало того, что этот ужасный код, он также замораживает терминал, над которым я работаю. Я верю, что рекурсия сделает его намного приятнее, но я изо всех сил пытаюсь понять идею при использовании строки (я понимаю, когда это число). Спасибо!

#include <stdio.h> 

int sec(int width, int snum) { 

    char section[100]; 
    sprintf(section, "Section "); 
    printf("%s %i", section, snum); 
    return 0; 
} 

int ssec_num(int width, int i) { 
    char num[100]; 
    sprintf(num, "%i", i); 
    printf(".%s", num); 
} 

int ssec_let(int width, char z) { 
    char let[100]; 
    sprintf(let, ".%c", z); 
    printf("%s", let); 
} 


int main(int argc, char* argv[]) { 
    int depth = atoi(argv[1]); 
    int width = atoi(argv[2]); 
    int sec_int=1; 
    int sec_wid = width; 
    int let_wid; 
    int num_int; 
    int num_dep; 
    int num_wid; 
    int dep; 
    char z = 'A'; 

    while(sec_wid > 0) { 
     sec(width, sec_int); 
     let_wid = width; 
     dep = depth-1; 
     printf("\n"); 
     while(dep > 0) { 
      while(let_wid > 0) { 
       num_wid = width; 
       num_int = 1; 
       sec(width, sec_int); 
       ssec_let(let_wid, z); 
       printf("\n"); 
       num_dep = depth-2; 
        while(num_dep > 0) { 
         while(num_wid > 0) { 
          sec(width, sec_int); 
          ssec_let(let_wid, z); 
          ssec_num(width, num_int); 
          num_wid--; 
          num_int++; 
          printf("\n"); 
          num_dep--; 
         } 
        } 
       let_wid --; 
       z++; 
      } 
      dep --; 
     } 
    sec_int++; 
    sec_wid--; 
    z = 'A'; 
    } 
} 

Если depth является 3 и width является 2, то было бы

Section 1 
Section 1.A 
    Section 1.A.1 
    Section 1.A.2 
Section 1.B 
    Section 1.B.1 
    Section 1.B.2 
Section 2 
Section 2.A 
    Section 2.A.1 
    Section 2.A.2 
Section 2.B 
    Section 2.B.1 
    Section 2.B.2 
+1

Показать, что вывод, который вы хотите для какого входа. –

+0

Я не вижу рекурсии здесь, только вложенные петли. – Baldrickk

+0

@Baldrickk: OP думает, что рекурсия - хорошая вещь для того, что он хочет сделать (я не смог это понять). –

ответ

2

Алгоритм вы описали использует width объявить, сколько раз повторяется каждый раздел (суб). Такой повтор можно достичь с помощью цикла.

В алгоритме также используется depth, чтобы определить, сколько (секций) секций у вас есть. Вот сложная часть, и вы можете использовать рекурсию для ее решения. Рекурсивная функция - это в основном функция, которая называет себя ограниченным числом раз. Всегда должно быть условие, чтобы остановить рекурсию, иначе функция будет вызывать себя до тех пор, пока стек вызовов не переполнится, аномально остановив выполнение программы.

Для вашей проблемы у вас может быть функция, которая получает счетчик, который определяет на глубине раздела (sub) в данный момент. Он будет петлять width раз (как описано выше) и называть себя depth раз, пока счетчик не достигнет значения depth. Таким образом, у вас будет функция, имеющая depth количество (под) разделов, каждая из которых содержит width.

Как вам нужно напечатать секции (под) на предыдущих глубинах, вы можете использовать буфер для хранения значений секций на каждой глубине, например int buffer[MAX_DEPTH];, с #define MAX_DEPTH 100, чтобы установить максимальную глубину вашей программы.

Тогда вы будете иметь что-то вроде

#include <stdio.h> 

#define MAX_DEPTH 100 

void print_section(const int *const buffer, const int current_depth) { 
    // print all the (sub)section values stored at the buffer so far 
    // use a loop like for (i = 0; i <= current_depth; i++) 
} 

void recursive(int *const buffer, const int current_depth, 
     const int depth, const int width) { 
    if (current_depth < depth) { 
     // continue recursion 
     int current_width; 
     for (current_width = 1; current_width <= width; current_width++) { 
      buffer[current_depth] = current_width; 
      print_section(buffer, current_depth); 
      recursive(buffer, current_depth + 1, depth, width); 
     } 
    } 
    // else stop recursion 
} 

int main(int argc, char* argv[]) { 
    // ... 
    int buffer[MAX_DEPTH]; 
    recursive(buffer, 0, depth, width); 
    return 0; 
} 

Вам также нужна дополнительная логика, чтобы определить, когда напечатать букву или цифру в каждой (суб) глубины сечения.

EDIT: Чтобы напечатать название раздела (суб) только с помощью следующей

void print_section(const int *const buffer, const int current_depth) { 
    int i; 
    printf("Section "); 
    for (i = 0; i <= current_depth; i++) { 
     printf(i == 0 ? "%i" : ".%i", buffer[i]); 
    } 
    printf("\n"); 
} 
+0

Я чувствую, что я собираюсь пойти по тому же пути из множества петель, чтобы определить, что должно быть в каждом подразделе. Я думаю, что в итоге я получаю 10 циклов - 1 для секции заголовка, а затем 9 для каждого потенциального подраздела. –

+0

Обновлен ответ. – ericbn

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