只是好奇的問題,不嚴重。
在 JS 語言中,我知道可以用以下形式定義階乘運算。
function factorial(n) {
if (n === 1) return 1;
return factorial(n - 1) * n;
}
然后我以下面的形式定義了階乘運算的階乘,并將其命名為super_factorial_1. 維基百科上也有類似的描述。
function super_factorial_1(n) {
if (n === 1) return factorial(1);
return super_factorial_1(n - 1) * factorial(n);
}
類似地,使用 thesuper_factorial_1作為運算子,thesuper_factorial_2在此處定義:
function super_factorial_2(n) {
if (n === 1) return super_factorial_1(1);
return super_factorial_2(n - 1) * super_factorial_1(n);
}
現在的問題是如何定義的super_factorial_n操作,并且super_factorial_n_n,此外,該super_factorial_n..._n{n of n}。
我用粗略的方法定義了上面的super_factorial_n操作,但是我覺得這個方法不夠好。
function super_factorial_n(n, m) {
const fns = Array(n 1).fill(0);
fns[0] = factorial;
for (let i = 1; i <= n; i ) {
fns[i] = function (m) {
if (m === 1) return fns[i - 1](1);
return fns[i](m - 1) * fns[i - 1](m);
}
}
return fns[n](m);
}
或許這是流程編程范式的一個優化方向。:)
uj5u.com熱心網友回復:
偽代碼
// j is the level number
// i = j - 1
function super_factorial_j(n) {
if (n === 1)
return super_factorial_i(1);
return super_factorial_j(n - 1) * super_factorial_i(n);
}
引數化j和i
function super_factorial(j, n) {
if (n === 1)
return super_factorial(j - 1, 1);
return super_factorial(j, n - 1) * super_factorial(j - 1, n);
}
添加退出條件
function super_factorial(j, n) {
if (j == 0) { // or j == 1 for one based level number
if (n === 1)
return 1;
return super_factorial(0, n - 1) * n;
}
if (n === 1)
return super_factorial(j - 1, 1);
return super_factorial(j, n - 1) * super_factorial(j - 1, n);
}
當然,這只是眾多方法中的一種。很難說這是否比任何其他更好。遞回函式通常會消耗堆疊記憶體。但是價值可能增長得非常快,無論如何用大數字呼叫它并不是很習慣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382597.html
標籤:javascript 数学 计算机科学 范式
上一篇:JDK5的JavaMath.nextAfter()實作方法
下一篇:方法有效但會引發特定數字的錯誤
