2015-11-02 81 views
-3

有人可以向我解釋在這發生了什麼?從我所擁有的小知識(顯然我的思想是錯誤的),對我來說,這應該繼續減少x 1,直到x是3.然後它應該返回到'返回true,部分,並且當函數返回true時,它返回第二個if語句,返回false,然後退出函數,因爲如果函數返回false,則沒有任何操作。但是,這繼續回到第二個if語句,將x加1直到它再次爲9,然後退出。提前致謝。布爾返回遞歸函數意外地改變變量

bool Rec(int x) 
    { 
     if(x > 3) 
     { 
      if(Rec(x - 1) == true) 
      { 
       return false; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return true; 
     } 

    } 
    void main() 
    { 
     Rec(9); 
    } 
+0

您的第一個子句可以用'return false;'替換? –

+0

@πάνταῥεῖ:或者帶'return x <= 3的整個函數體' – Olaf

+0

你想完成什麼? 「改變變量...」是什麼意思?這裏的遞歸是無用的。 – Olaf

回答

0

其實我沒有看到你的代碼功能的問題。它實際上工作。

它可以簡化,等同於:

#include <stdio.h> 

bool Rec(int x) 
{ 
    printf("x = %d\n", x); 

    if (x > 3) 
    { 
     Rec(x - 1); 
     return false; 
    } 

    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    Rec(9); 
    return 0; 
} 

主要生產:

x=9 
x=8 
x=7 
x=6 
x=5 
x=4 
x=3 

但是你也說:「但這樣下去要回第二if語句添加1到x,直到它再次爲9,然後退出「。但是你實際上並沒有將1添加到x。我認爲發生的事情就是處理你的調試。您沒有在代碼中進行任何調試來打印出所述行爲。

所以我會試着爲你做。

bool Rec(int x) 
{ 
    printf("x = %d\n", x); 

    if (x > 3) 
    { 
     Rec(x - 1); 
     printf("*x = %d\n", x); 

     return false; 
    } 

    return true; 
} 

主要生產:

x = 9 
x = 8 
x = 7 
x = 6 
x = 5 
x = 4 
x = 3 
*x = 4 
*x = 5 
*x = 6 
*x = 7 
*x = 8 
*x = 9 

仔細想想這一點。你沒有添加1.你的函數正在調用自己再次打印x =,然後如果它大於3的話。只有當x> 3時纔會返回。它返回後將再次打印* x = 所以它實際上是在遞歸調用之前打印x的內容。我希望能幫助你看到發生了什麼。

你的函數很好看看遞歸如何工作。但在實踐中,你永遠不會寫這樣的代碼。因爲你可以把它寫成一個簡單的循環。

如果您可以使用循環創建代碼,請避免遞歸。但有時,遞歸更容易。例如,遍歷二叉樹非常簡單。

這裏有一些關於這個問題的答案,它給出了遞歸有意義的現實世界的例子。 Real-world examples of recursion

+0

偉大的這是我所追求的。爲了理解我這個措辭不佳的問題做得很好,非常感謝! – CoconutDug

-1

這是遞歸的性質。你調用函數6次,它將返回6次。