2017-05-03 47 views
-4

在我的課程中,我有一個謎團,編寫一個遞歸函數,它將顯示符號'%'和'#'替代用戶輸入的數字。 因此,如果我說用戶輸入了數字5,結果將如下所示:'%#%#%'。C#字符串在嘗試使用遞歸函數時保持爲空

我想我已完成大部分工作。我現在唯一的問題是,我必須顯示符號的字符串在函數每次迭代時都會變爲'空'。

這是我的代碼:

public static string ShowGibrish(int num) 
{ 
    string s=""; 
    while (num!=0) 
    { 
     if (num % 2 == 0) 
     { 
      s = s+ "%"; 
      ShowGibrish(num - 1); 
     } 
     else if (num % 2 != 0) 
     { 
      s =s+ "#"; 
      return ShowGibrish(num - 1); 
     } 

    } 
    return s; 
} 

其他學生使用StringBuilder的,以使字符串顯示,與使用其他私有函數和與公衆的函數調用它。但我認爲我的代碼也可以工作。

回答

1

試試這個:

public static string ShowGibberish(int num) 
{ 
    if (num == 0) { return ""; } 
    else { 
     if (num % 2 == 0) {return "%" + ShowGibberish(num-1);} 
     else {return "#" + ShowGibberish(num-1);} 
    } 
} 

您的代碼混合迭代和遞歸方法。使用一個或另一個只是爲了解決這個乾淨。

+0

你是對的,但由於這是他們的家庭作業,我不認爲你應該提供代碼。 –

+0

很短的實現,只是爲了整潔ShowGibrish拼寫有兩種不同的方式,也許是正確的? –

+0

@Alex Rosenfeld謝謝,這不像我的代碼,但它的工作原理! – Dolev

0

看起來問題在於你的while循環。發生什麼是堆棧上的每個函數實例正在執行一個while循環,而不是循環僅由遞歸處理。函數的每個實例只應在基本情況!= 0而不是基本情況!= 0時執行。

變量的作用域爲它們各自的功能,所以在代碼的當前狀態中,值while循環評估永遠不能達到0.

對不起,我不會爲你提供代碼,因爲它是一個任務。

1

您遇到的第一個問題是您在該方法的開始處聲明瞭一個新字符串,但是您絕不會將該字符串傳輸到遞歸函數中,這意味着您會從串聯中失去所有進度。

第二個問題是你有一個while循環由於某種原因,據我所知在這裏不需要。

  1. 首先給函數添加一個可選參數:string s = ""
  2. 取出while循環,它不需要
  3. 你應該做的是檢查是否num是否爲0,並返回小號,如果它是第一件事。
  4. 修改S的基於你的奇/偶邏輯
  5. 然後返回遞歸調用ShowGibrish(num - 1, s)

我刪除代碼的結果,因爲我沒趕上功課的一部分。

+0

謝謝你的解釋!相信我,我不知道那裏發生了什麼。一位老師教一條路,另一位老師告訴你'不行,應該是這樣'我不知道他們想要什麼了。 – Dolev