2015-01-13 86 views
0

由於用戶BLUEPIXY,Code2應該表示等同於Code1的遞歸算法。但是,我不完全確定Code2確實是遞歸的:可以有這樣的條件嗎?等價於迭代算法的遞歸

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

你不應該有一個明確的基本情況嗎?請,你能澄清一下嗎?


代碼1:

#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; 
} 

這裏,times函數調用printValue n次。但在遞歸示例中,它調用printValue,並用n-1調用次數。

所以對於案件:

基本情況:times(0)應該返回

迭代:times(n)應該叫printValue一次,然後調用times(n-1)

+0

你的觀點是...? –

+0

Op說'但是,我不完全確定Code2確實是遞歸的'而且我爲code2提供了一個基本/迭代的例子。我還簡化了代碼1以強調「時間」函數在代碼2中遞歸,而不是在代碼1中遞歸。 – holgac