下面是一段代碼,它使用遞歸來找到數組中的 數字的產品,但我沒有得到如何做同樣的遞歸的尾部 的任何建議?對C語言中的代碼應用尾遞歸?
int Product(int a[], int i, int n)
{
return (i >= n) ? 1 : a[i] * Product(a, i + 1, n);
}
下面是一段代碼,它使用遞歸來找到數組中的 數字的產品,但我沒有得到如何做同樣的遞歸的尾部 的任何建議?對C語言中的代碼應用尾遞歸?
int Product(int a[], int i, int n)
{
return (i >= n) ? 1 : a[i] * Product(a, i + 1, n);
}
在其當前形式中,您的代碼不是尾遞歸。遞歸調用必須是函數中的最後一個指令,並且在您的代碼中,遞歸調用之後會發生乘法。所以,你必須更改簽名採取蓄能器,將舉行迄今數的乘積:
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);
}
這是什麼語言? – iliketocode
括號不應該在數據類型上,而不是參數的名稱? –
@KevinAvignon,如果是C#,是的。但是我錯了,OP已經改了標題,提到它是C. –