2009-11-30 62 views
0

我正在做一個C課程。 我需要做一個遞歸XOR二進制,但我有一些限制。 我不能使用循環或任何math.h函數,也不能從異或函數調用另一個函數。遞歸二進制到沒有pow()或循環的十進制函數

這是函數原型:

int binaryXor(int firstnumber[], int secondnumber[], int length); 

其中firstnumber和secondnumber與1和0和長度相同的長度的陣列是它們的長度。

該函數應返回這兩個數組的XOR的十進制值。 做異或操作非常簡單,但是如何將其轉換爲十進制並具有所有限制?

+0

此函數不返回任何東西了「十進制值」,它返回一個int。 –

+0

從邏輯上說,是否可以處理數組中的每個元素,而不會使進程成爲循環? –

+0

在課程任務的上下文中,我非常確定,如果您被要求編寫「遞歸函數」並且「不能使用循環」,那麼遞歸調用不是循環。你可能會也可能不會同意這個循環的定義,但我很肯定在這裏它意味着任何過程循環結構。 –

回答

2

這是一個標準的遞歸問題。訣竅是要認識到,1和0的字符串後跟1或0的整數值是2 *字符串的整數值加上數字的值。

所以,你會想要做類似

if(length <= 0) return 0; 

return 2 * binaryXOR(firstnumber, secondnumber, length - 1) + (firstnumber[length - 1]^secondnumber[length - 1]); 
+1

'+'和'^'的相對優先級是多少?那麼爲什麼你的表達給出了錯誤的答案?混合算術運算和按位運算時使用括號(括號)! –

+0

謝謝喬納森。我通常不會測試這些作業答案。 OP可以從我的錯誤中學到一些東西! – UncleO

+0

非常感謝,你幫了我很多。 – Ariel

0

可以使用遞歸函數調用來代替循環。

+0

確實 - 我討厭這類問題。誰會使用遞歸遍歷數組? –

+2

在C中,沒有人。在功能語言中,每個人。所以可以肯定的是,學校應該用功能性語言或更自然的例子教授遞歸。但是不能簡單地歸約到循環的遞歸不是尾遞歸的,而且在遞歸引入的早期階段,無法進行尾遞歸的問題可能稍微超出了課程級別。至少,我認爲這是導致這些「做你永遠不會真正做的事情,只是爲了說明一個點」作業的想法。 –

3

爲了寫一個遞歸函數,沒有循環,就需要回答以下問題:「我怎樣才能表達回答我的問題,在一個較小的問題條款」

在這種情況下,問題是,你必須length數字看,但你不能循環。那麼,你如何用更小的xor來表達一個尺寸爲length的xor,以及一些不需要循環的工作量?

[編輯:死守,只是看着你的問題又來了,你說你已經擁有的XOR排序,所以我想你已經做到了這一點。在這種情況下,我上面的評論是你需要知道的唯一事情:你完成了。 C中的int不是十進制值,它只是一個值。您不需要將任何內容轉換爲小數,以便將其存儲或返回至int

如果你有興趣,但我可以張貼使用遞歸函數將int轉換爲十進制值的代碼。一種簡單的方法是在「下」多少位數的情況下,通過與較大和較大的10的功率進行比較,然後在返回「上」從最後打印出數字的方式來制定出數字。]

相關問題