2009-11-15 59 views
0

我已經編寫了下面的代碼來計算字符串遞歸的開始處的單詞長度。我想過一個我的代碼不能工作的情況「#@ * hello」我需要修改代碼來解決這個問題(正確的答案是5)?謝謝在遞歸字符串的開始處查找單詞的長度

int startWordLenRec(char s[]) { 
     int length; 
     if (isLetter(s[0]) == false){ 
      return 0; 
     } 
     else{ 
      length = 1 + startWordLenRec(s+1); 
     } 
     return length; 
    } 
+2

在這種情況下,你認爲什麼是正確答案? 0或5? – 2009-11-15 16:06:51

+0

正確答案是5.謝謝 – user133466 2009-11-15 16:07:36

回答

3

這是有點不清楚爲什麼你要在功能語言之外使用遞歸來解決這個問題。坦率地說,還有一點不清楚問題的實際參數是什麼。

如果您的實際意圖是衡量第一字的字符串(定義爲返回,如果傳遞給isLetter一個True結果字符序列)的長度,即使該字沒有在一開始啓動字符串,那麼最簡單,最清晰的解決方案似乎是:使函數將一個標誌作爲參數,稱爲letterSeenYet。在初次調用函數時,該標誌應該設置爲False

  • 如果函數讀取非字母字符,letterSeenYet標誌爲False,設置length等於0 +遞歸函數調用的結果,並確保對呼叫標誌設置爲False
  • 如果該函數讀取一個字母字符,請將length設置爲1 +遞歸函數調用的結果,並確保該調用的標誌設置爲True
  • 如果函數讀取非字母字符,letterSeenYet標誌True,返回0

我希望你看到的邏輯:你想有一個非字母字符意味着「停止計數字母」 ,但在看到一些字母后,只有

同樣,我真的不明白你爲什麼使用遞歸來解決這個問題。有一些問題在遞歸形式中更容易理解,但是這似乎很容易(並且更有效)反覆處理。 (另外,正如Charles Salvia指出的那樣,您不僅要準備第一個單詞的結尾,而且還要準備字符串的末尾。)

0

根據遞歸進行思考可能有點棘手。沒有深入瞭解爲什麼或爲什麼不使用遞歸,我們假設它必須是遞歸(作業,發現,無論什麼原因)。

因此,遞歸考慮的主要問題是終止條件是。如果你在這樣做時遇到困難,也許用迭代的方式編寫算法可以幫助你。

在這種情況下,您需要確定的是字符數組何時結束。如果當前字符是'\0',則會出現這種情況。

一個簡單的遞歸算法可能是:

  • 檢查當前字符。它是'\ 0'嗎?
    • 是:退貨0
    • 目前的角色是一封信嗎?
      • 是:返回1 +調用帶有遞增字符指針此功能
      • 號:返回0 +調用帶有遞增字符指針此功能

注意,這個算法不會在看到一個非字母字符後終止,所以「test a」將返回5,而不是4.如果之前必須終止,則需要某種類型的標誌,並傳遞給該函數。

無論如何,我的主要觀點是想到什麼終止條件應該是。