2015-01-13 2 views
0

Код2, благодаря пользователю BLUEPIXY, должен представлять собой рекурсивный алгоритм, эквивалентный Code1. Тем не менее, я не совсем уверен, что Code2 действительно рекурсивный: нормально ли иметь такое состояние?Рекурсивный эквивалент итеративного алгоритма

if(n>0){ 
      func(); 
      times(--n, func); 
     } 

Разве у вас нет четко определенного основания? Пожалуйста, не могли бы вы уточнить?


Code1:

#include <stdio.h> 

void printValue(); 

int main(){ 
    int n = 100; 
    int i; 
    for (i=0; i<n; i+=1) 
      printValue(); 
} 


void printValue(){ 
    static unsigned int y = 0; 
    printf("y = %d", y); 
    y+=1; 
} 

Кодекса2:

#include <stdio.h> 

void printValue(void); 
void times(int n, void (*func)(void)){ 
    if(n>0){ 
     func(); 
     times(--n, func); 
    } 
} 

int main (void){ 
    int n = 100; 
    times(n, printValue); 
    return 0; 
} 

void printValue(void){ 
    static unsigned int y = 0; 
    printf("y = %d\n", y); 
    y+=1; 
} 
+0

Код выглядит хорошо, рекурсия выглядит нормально –

+0

Что значит «хорошо определить базовый регистр»? вы попробовали запустить оба решения, чтобы убедить себя, что выход такой же? – John3136

+0

@ John3136 Я вижу, что вывод тот же, но я не совсем уверен, что code2 является рекурсивным алгоритмом. Не могли бы вы объяснить, почему он рекурсивный? – mathlearner

ответ

0

Допустим, код 1 как то (я просто создал новую функцию, которая выполняет итерации, ничего другого)

#include <stdio.h> 
void printValue(); 
int times(int n, void (*func)(void)) { 
    for(int i=0; i<n; ++i) 
     func(); 
} 
int main(){ 
    int n = 100; 
    int i; 
    times(n, printValue); 
} 

void printValue(){ 
    static unsigned int y = 0; 
    printf("y = %d", y); 
    y+=1; 
} 

Здесь функция функции вызывает printValue n раз. Но в вашем рекурсивном примере он вызывает printValue и вызывает время с n-1.

Так, за исключением случаев:

Базовый вариант: times(0) должен возвращать

Итерация: times(n) должен вызвать printValue один раз, а затем вызвать times(n-1).

+0

И ваш вопрос ...? –

+0

Op сказал: «Однако я не совсем уверен, что Code2 действительно рекурсивный», и я предложил базовый/итерационный код для кода2. Я также упростил код1, чтобы подчеркнуть, что функция 'times' является рекурсивной в коде2, а не code1. – holgac

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