2017-08-07 81 views
-4

編寫一個遞歸C++函數,該函數返回作爲參數傳輸的自然數的最小偶數位。 如果該號碼不包含任何偶數位,它將返回-1。C++遞歸:返回數字的最小偶數位

很容易做到不遞歸:

int cifminpar(int x) 
{ 
    int mi = 9; 
    while(x) 
    { 
     if(x % 10 % 2 == 0) 
     mi = min(mi , x%10); 
     x /= 10; 

    } 
    if(mi == 9) 
     return -1; 
    else return mi; 

} 

我如何做,與遞歸?

+5

你試過了什麼?它在哪裏失敗? – DimChtz

+0

你的意思是數字? – StoryTeller

+0

爲什麼遞歸甚至是必要的? – iBug

回答

0

下面是什麼情況?

int cifminpar(const int x) 
{ 
    if(!x) 
     return 11; 
    //recursive call 
    int minrest=cifminpar(x/10); //min even in the rest of the digits 
    if(x % 10 % 2 == 0) 
     return min(minrest , x%10); 
    return minrest; 
} 

如果發現沒有工作,甚至數字如下,假設初始數量不0它返回11。 您可以輕鬆修復它,以便在發生故障時將-1返回,並將0作爲輸入返回。

0

請記住:最小的偶數位是「第一個」或「沒有第一個的數字中最小的一個」。

您可以遞歸的比較「當前數字」和「後,最小的數字」:

int cifminpar(int x) 
    { 
     int ret = cifminpar_recur(x, 10); 
     if (ret == 10) 
      return -1; 
     return ret; 
    } 

    int cifminpar_recur(int x, int mi) 
    { 
     if (x == 0) 
      return mi; 
     if (x % 2 == 1) 
      mi = min(mi, x % 10); 
     return cifminpar_recur(x/10, mi); 
    } 

我們甚至可以刪除多餘的變量。

int cifminpar(int x) 
    { 
     int ret = cifminpar_recur_optimised(x); 
     if (ret == 10) 
      return -1; 
     return ret; 
    } 

    int cifminpar_recur_optimised(int x) 
    { 
     if (x == 0) 
      return 10; 
     if (x % 2 == 1) 
      return min(x % 10, cifminpar_recur_optimised(x/10)); 
     return cifminpar_recur_optimised(x/10); 
    }