首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby初学者-需要帮助优化这段代码

Ruby初学者-需要帮助优化这段代码
EN

Stack Overflow用户
提问于 2016-11-29 03:17:05
回答 2查看 448关注 0票数 4

目前,我正在学习Ruby/编程,我遇到了这样的问题:

你的任务是建造一座建筑,它将是一堆立方体。底部的多维数据集将有一个n^3的卷,上面的多维数据集将有(n-1)^3的体积等等,直到顶部有一个1^3的卷。您将得到该建筑的总体积m。如果给了m,您能找到必须构建的多维数据集的数量n吗?函数findNb(find_nb, find-nb)的参数将是整数m,如果存在这样的n,则必须返回整数n,如n^3 + (n-1)^3 + ... + 1^3 = m;如果没有这样的n*,则返回-1

下面是我解决这个问题的尝试:

代码语言:javascript
复制
def find_nb(m)
  (1..Float::INFINITY).each do |n|
    if (1..n).inject(0) {|sum, value| sum + value**3} == m
      return p n 
    else
      next
    end
  end
end

对于我知道将起作用的输入来说,这似乎是正常的,例如:

代码语言:javascript
复制
find_nb(4183059834009)
find_nb(135440716410000)
find_nb(40539911473216)

我需要帮助的领域:

  • 我不知道当没有满足方程并因此输出输入的n值时,如何才能理解它 find_nb(24723578342962)
  • 任何关于如何使现有代码更好的提示都将受到极大的赞赏。
EN

Stack Overflow用户

回答已采纳

发布于 2016-11-29 03:49:26

提示1:您不需要进入无穷大:在某个n之后,和将大于m,并且很快就会越走越远。

提示2:如果找到n,函数将永远不会到达它的最后一行,因为有return

提示3:如果您到达next块的末尾,那么each是自动的。

提示4:每次都不需要从头开始重新计算立方体的总和。你不是在建造一个全新的建筑,你只是在下面放一个更大的立方体。

所以..。

代码语言:javascript
复制
def find_nb(m)
  n = 1
  sum = 1
  while sum < m
    n += 1
    sum += n**3
  end
  return sum == m ? n : -1
end

编辑:这是一个功能版本,但我认为上面的普通while仍然清晰得多(而且可能也更快):

代码语言:javascript
复制
def find_nb(m)
  sum = 0
  sizes = 1.upto(Float::INFINITY)
    .lazy
    .map { |n| sum += n ** 3 }
    .take_while { |x| x <= m }
    .to_a
  sizes.last == m ? sizes.length : -1
end
票数 7
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40857191

复制
相关文章

相似问题

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