我已經撰寫了這個問題的代碼,但它只適用于 70% 的測驗用例。我無法弄清楚它有什么問題。請幫忙。
問題:- 找出給定整數 X 可以表示為 [1,25] 范圍內的唯一自然數的 N 次方之和的方式數,包括在內。
暗示:-
答案將是 (1^2 3^2)。
我的代碼不適用于 x = 100 和 n = 2。輸出應該是 3,但它回傳 33。
let x = 100;
let n = 2;
let num = 0;
let index = 1;
function power(x, n, num, index, ways = 0) {
if (x === num) {
return 1;
}
if (x < num) {
return 0;
}
for (let i = index; i <= 25; i ) {
ways = power(x, n, (num ((i) ** n)), index 1);
}
return ways;
}
console.log(power(x, n, num, index));
uj5u.com熱心網友回復:
你的邏輯幾乎是正確的。但是您沒有正確洗掉重復值并最終包含諸如9^2 3^2 3^2 1^2or之類的內容5^2 5^2 5^2 4^2 3^2。
您需要更改您傳遞的遞回索引。你不應該使用你的index引數,而是你的回圈迭代器,i:
let x = 100;
let n = 2;
let num = 0;
let index = 1;
function power(x, n, num, index, ways = 0) {
if (x === num) {
return 1;
}
if (x < num) {
return 0;
}
for (let i = index; i <= 25; i ) {
// ways = power(x, n, (num ((i) ** n)), index 1);
// v-^
ways = power(x, n, (num ((i) ** n)), i 1);
}
return ways;
}
console.log(power(x, n, num, index));
通過從頭開始撰寫我自己的函式版本,我很快就解決了這個問題,并得到了完全相同的錯誤結果。我添加了一些日志記錄并意識到了問題并能夠快速發現它。這很容易翻譯成您的代碼。
但我認為我的功能更干凈,所以我將它包括在這里。它的邏輯大致相同,但功能更簡潔:
const range = (lo, hi) =>
Array .from ({length: hi - lo 1}, (_, i) => i lo)
const sum = (ns) =>
ns .reduce ((a, b) => a b, 0)
const countPowerSums = (n, p, i = 1) =>
n < 0
? 0
: n == 0
? 1
: sum (range (i, 25) .map (b => countPowerSums (n - b ** p, p, b 1)))
console .log (countPowerSums (100, 2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/429734.html
標籤:javascript 递归
上一篇:計算陣列布林值的遞回方法
下一篇:在javascript中使用filter()來實作curriable()是可行的,但是,uisngmap()是可行的,為什么?
