2011-04-08 197 views
0

有一個遞歸函數f()。它正在查看cond,然後返回或執行f(),然後g()。考慮將cond作爲一個外部變量,可以在其他地方設置,也許在不同的線程中。將迭代函數更改爲迭代

  1. 如果第一五次cond被選中,cond == true,但第六時間,cond == false,描述代碼流。

  2. 因爲這是遞歸的,所以如果cond == true的時間太長,代碼可能會遭受堆棧溢出。填寫函數iterative_f(),以使代碼流與(1)中的代碼流相同。

    //recursive 
    
    void f() 
    { 
        if(cond == false) 
         return; 
        f(); 
        g(); 
    } 
    
    //iterative 
    void iterative_f() { 
    
    } 
    
+1

所以遺憾地看到教師提供'boolean_variable == FALSE'!請使用'if(!cond)'或'if(not cond)'(等效和標準,儘管我不確定是否甚至MSVC++ 2010支持「不」) - 認爲他們太擔心打破人們打電話他們的變量「不」)。 – 2011-04-08 04:23:59

+0

@Tony:'not'不是C關鍵字。 – JeremyP 2011-04-08 10:47:12

+0

JeremyP:true - 僅限於C++ - 我應該檢查問題的標籤: - /。 – 2011-04-08 16:49:58

回答

4
  1. 由於cond是假的第6次,該功能將有效執行5次。結果是函數g將被執行5次。

  2. 現在你可以寫出如下迭代函數:

 
    void iterative_f() 
    { 
     while(cond) 
     { 
      g(); 
     } 
    } 
+0

我在接受採訪時被問及這是我確切的答案。然而,面試官說這個迭代函數會改變函數g()被調用的順序。在遞歸函數中,首先調用函數g()的第五個實例。但是,這個迭代版本會首先調用第一個實例。 – tbag 2011-04-08 18:48:45

+0

是的,這可能是一個合乎邏輯的論點。但是對一個函數進行一系列的調用不能有特定順序的概念。 – bala 2011-04-09 07:04:20

+0

讓我們以更簡單的方式。對於遞歸函數,我們不是首先調用函數g()的第5個實例,但是我們在函數f()的第5次調用中第一次調用函數g()。至於迭代函數,我們在第一次迭代中第一次調用函數g()。那有意義嗎? – bala 2011-04-09 07:11:20