2016-03-09 114 views
0

如果我有這樣的代碼塊在這裏:尋找快速提示關於遞歸

int n = 29; //or any number 
    int i; 
    int[] test = new int[100]; 
      while(n > 0) 
      { 
       test[i++] = n % 2; 
       n = n/2; 
      } 

,我希望把它遞歸的,我從我的頭頂認爲是相當跛腳。

void Convert(int n) 
{ 
    if(n < 1) 
    return;     

    else 
    { 
     test[i++] = n % 2 
     n = n/2; 
     Convert(n); 
    } 
} 

我正在尋找遞歸編寫的最佳方法。預先感謝您的指導:)

+1

我看不出有任何理由遞歸地做到這一點。如果你的目標是熟悉遞歸概念,我建議你看一下Haskell語言。它很容易進入,它暴露了很多與遞歸有關的事情; 「學習你一個偉大的好Haskell」是一個初學者的美妙指南。 –

+1

您可以返回test []作爲該方法的結果。 –

+0

@DiligentKeyPresser - 你是正確的先生,我想熟悉遞歸。我不打算以遞歸方式執行示例代碼。謝謝你的例子,因爲我沒有聽說過它。愛大象:) – Airynd

回答

2

我會在回答前說明這不是遞歸的理想選擇,因爲這樣做並不容易理解。儘管如此,這裏還是要做到這一點的一種方法:

static void Main(string[] args) 
{ 
    var result = Convert(new List<int>(), 192); 
} 

static List<int> Convert(List<int> bits, int n) 
{ 
    if (n < 1) 
    { 
     return bits; 
    } 
    else 
    { 
     bits.Add(n % 2); 
     return Convert(bits, n/2); 
    } 
} 

遞歸工作時,你最好能保持你的一切正在執行的參數遞歸方法的一部分的操作狀態。對於這種方法,操作的「狀態」包括我們當前試圖轉換的數字,以及已經轉換的位。

傳遞位列表以及n可防止在遞歸函數之外聲明數組和迭代器變量。切換到List允許我們將下一個位追加到我們迄今創建的位的末尾。對於遞歸方法的初始調用,我們必須通過傳遞一個空的List「種子」狀態。

+0

感謝您快速解釋BJ!發現一本有用的書,感謝DiligentKeyPresser - 「瞭解你對Haskell的好處」。從首先看它並閱讀一些評論,它似乎是功能性編程的一個體面的介紹。 – Airynd

0
int i = 0; 

int Convert(int n) 
{ 
    if(n < 1) return 0; 
    else 
    { 
     test[i++] = Convert(n/2); 
     return n % 2; 
    } 
} 

希望這個工程。

0

您試圖獲取數組中提供的數字的位。假設陣列具有足夠的尺寸:

void GetBits(int number, int index, int[] bits) 
{ 
    if (number < 1) 
    { 
     bits[index] = 0; 
     return; 
    }   
    bits[index] = number % 2; 
    GetBits(number/2, index + 1, bits); 
} 

這種方法將與初始索引= 0一樣,GetBits(number, 0, bits)被調用。