2015-10-18 50 views
1

下面是一段代碼,它使用遞歸來找到數組中的 數字的產品,但我沒有得到如何做同樣的遞歸的尾部 的任何建議?對C語言中的代碼應用尾遞歸?

int Product(int a[], int i, int n) 
    { 
    return (i >= n) ? 1 : a[i] * Product(a, i + 1, n); 
    } 
+0

這是什麼語言? – iliketocode

+0

括號不應該在數據類型上,而不是參數的名稱? –

+1

@KevinAvignon,如果是C#,是的。但是我錯了,OP已經改了標題,提到它是C. –

回答

2

在其當前形式中,您的代碼不是尾遞歸。遞歸調用必須是函數中的最後一個指令,並且在您的代碼中,遞歸調用之後會發生乘法。所以,你必須更改簽名採取蓄能器,將舉行迄今數的乘積:

int Product(int a[], int i, int n, int acc) 
{ 
    return (i >= n) ? 1 : Product(a, i + 1, n, a[i] * acc); 
} 

對於初始呼叫,你應該通過1的累加值。由於尾遞歸形式使用起來不是很方便,所以可以將函數分隔成一個輔助函數和另一個實際實現的函數:

int Product(int a[], int i, int n) 
{ 
    return TailProduct(a, i, n, 1); 
} 

int TailProduct(int a[], int i, int n, int acc) 
{ 
    return (i >= n) ? 1 : Product(a, i + 1, n, a[i] * acc); 
} 
+0

acc是什麼初始值? – want2

+0

@ want2,我編輯了我的答案來提及它。初始值應爲1,因爲它是乘法的標識元素。 (總的來說,它會是0) –

+0

和使用goto標籤一樣,以及如何使用正常迭代來做同樣的事情? – want2