5 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
答案樓上其實(shí)都有了,然而題目要求遞歸,
遞歸吧,我的理解呢,就是盡量避免什么轉(zhuǎn)化過程,盡量少動(dòng)腦吧?
我就主要說說解這種題的思路吧。
遞歸的思路就是分階段求解,然后定終點(diǎn)。
核心就是找fn(n)和fn(n-1)的關(guān)系,結(jié)合邊界條件fn(1),寫出一個(gè)如下的函數(shù):
function fn(n) {
// 終點(diǎn)
if (...) return ...;
// 遞歸
return fn(n-1) + ...;
}
以本題來說,
fn(n) = 1 + 2 + 3 + ... + n-1 + n + n-1 + ... + 3 + 2 + 1;
fn(n-1) = 1 + 2 + 3 + ... + n-1 + ... + 3 + 2 + 1;
故
fn(n) = fn(n-1) + n-1 + n;
終點(diǎn)
fn(1) = 1;
結(jié)合便能寫出
function fn(n) {
if (n==1) return 1; // 終點(diǎn)
return fn(n-1) + n-1 + n; // 遞歸關(guān)系
}
類似的就同理可得咯

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
定義f(n) = sum(1, 2, 3, ..., n, ..., 3, 2, 1)。
解法一
問題轉(zhuǎn)化為f(n) = 2 * g(n) - n,其中g(shù)(n) = sum(1, 2, 3, ..., n)。不用高斯求和法強(qiáng)行遞歸的話,g(n) = g(n - 1) + n(n > 1),g(n) = 1(n = 1)。
function g(n) {
if(n > 1) return g(n - 1) + n;
else if(n == 1) return 1;
}
function f(n) {
return 2 * g(n) + n;
}
解法二
顯然,f(n) = f(n - 1) + n + (n - 1)(n > 1),f(n) = 1(n = 1)。
function f(n) {
if(n > 1) return f(n - 1) + n + n - 1;
else if(n == 1) return 1;
}

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
var a = 1;
for (var i = 2; i < n; i++) {
a = a + i
}
var sum = 2*a + n;
console.log(sum)

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
將1,2,3,..., n,..., 3,2,1轉(zhuǎn)化為求前n項(xiàng)的和與前n-1的和的和。
于是有了:
1 + 2 + 3 + 4 + ... + n + ... + 3 + 2 + 1 = n(n + 1)/2 + (n - 1)(n - 1 + 1)/2
整理得到 n2
所以:
Math.pow(n, 2)
但是題目又要求用遞歸做。
const cal = (n) => {
if(n === 1) {
return 1;
}
return 2 * n + cal(n - 1) - 1;
}
console.log(cal(4)) //16

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
不用數(shù)學(xué)的思想 單純用遞歸的思想
比如傳入4
先執(zhí)行先序遞歸 index++
先序遞歸做value = 1+2+3+4
滿足條件后 return;
然后執(zhí)行后續(xù)遞歸 開始index--
后續(xù)遞歸做value += 3+2+1+0;
var cal = function() {
var index=0;
var value=0;
return function show(n) {
if(n < 0) return;
value += index;
if(index === n)return;
index++;
show(n);
index--;
value += index;
return value;
}
};
cal()(4) // 16
添加回答
舉報(bào)