首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeWars - javascript -递归3或5的倍数

CodeWars - javascript -递归3或5的倍数
EN

Stack Overflow用户
提问于 2022-12-04 12:24:34
回答 3查看 47关注 0票数 0

我目前正在训练代码战,今天是3和5的倍数。我尝试了一个临时的解决方案,使用减+三元,它起作用了。

然后我试着用反求函数来解决这个问题。指示如下:

如果我们列出所有低于10的自然数,它们是3或5的倍数,我们得到3,5,6和9。这些倍数之和是23。

完成该解决方案,以便返回所有3或5倍数的总和,该倍数低于传入的数字。此外,如果数字为负数,则返回0(对于有数字的语言)。

链接在这里

https://www.codewars.com/kata/514b92a657cdc65150000006

这是我的解决方案:

代码语言:javascript
复制
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,但没有在我的计算机。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-12-04 12:28:17

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2022-12-04 12:52:02

您也可以使用算术序列的和来完成这一任务,而不需要迭代,所以O(1)。

维基

代码语言:javascript
复制
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))

票数 2
EN

Stack Overflow用户

发布于 2022-12-04 12:32:40

res定义为全局很可能是一个问题:它的值将被重用到函数的后续调用中。

将您的函数更改为以res作为参数。如果签名必须只定义一个参数,那么使用内部函数就是一种想法。

这里有一个使用嵌套函数的解决方案,简化了一些不必要的复杂和重复:

代码语言:javascript
复制
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的值。有关适当的递归实现,请参见柳井先生的答覆

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74675562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档