我目前正在训练代码战,今天是3和5的倍数。我尝试了一个临时的解决方案,使用减+三元,它起作用了。
然后我试着用反求函数来解决这个问题。指示如下:
如果我们列出所有低于10的自然数,它们是3或5的倍数,我们得到3,5,6和9。这些倍数之和是23。
完成该解决方案,以便返回所有3或5倍数的总和,该倍数低于传入的数字。此外,如果数字为负数,则返回0(对于有数字的语言)。
链接在这里
https://www.codewars.com/kata/514b92a657cdc65150000006
这是我的解决方案:
let res = 0
function solution(n){
if(n - 1 <= 0) {
return 0
}
if((n - 1) % 3 > 0) {
if((n - 1) % 5 > 0) {
return solution(n - 1, res)
} else {
res += n - 1
solution(n - 1, res)
}
} else {
res += n - 1
solution(n - 1, res)
}
return res
}它在我的计算机上工作,但在码战调度中失败,给出了很好的结果,例如解(6)= 9283,而在我的计算机上(正确的答案)。
此外,我得到的最大调用堆栈超过了在代码战9513,但没有在我的计算机。
有什么想法吗?
发布于 2022-12-04 12:28:17
function solution(number) {
// Base case: return 0 if the number is negative
if (number < 0) {
return 0;
}
// Recursive case: if the number is a multiple of 3 or 5, add it to the sum of
// the multiples of 3 or 5 below it, otherwise just return the sum of the
// multiples of 3 or 5 below it
return (number % 3 === 0 || number % 5 === 0)
? number + solution(number - 1)
: solution(number - 1);
}发布于 2022-12-04 12:52:02
您也可以使用算术序列的和来完成这一任务,而不需要迭代,所以O(1)。

const input = 10
function sum35(num){
num = num - 1
const lastThree = num - num%3
const threeQuantity = lastThree/3
const lastFive = num - num%5
const fiveQuantity = lastFive/5
return getSum(threeQuantity,3,lastThree) + getSum(fiveQuantity, 5, lastFive)
function getSum(n, first, last) {
return (n/2)*(first + last)
}
}
console.log(sum35(10))
发布于 2022-12-04 12:32:40
将res定义为全局很可能是一个问题:它的值将被重用到函数的后续调用中。
将您的函数更改为以res作为参数。如果签名必须只定义一个参数,那么使用内部函数就是一种想法。
这里有一个使用嵌套函数的解决方案,简化了一些不必要的复杂和重复:
function solution(n) {
let res = 0;
function _solution(n) {
if(n <= 0) {
return 0;
}
if(n % 3 != 0 && n % 5 != 0) {
return _solution(n - 1);
}
res += n;
_solution(n - 1);
return res;
}
return _solution(n - 1);
}但是请注意,这不是一种“干净”的递归方法,因为函数实际上是一个闭包,有一个副作用:修改外部变量res的值。有关适当的递归实现,请参见柳井先生的答覆。
https://stackoverflow.com/questions/74675562
复制相似问题