目前,我正在学习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。
下面是我解决这个问题的尝试:
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对于我知道将起作用的输入来说,这似乎是正常的,例如:
find_nb(4183059834009)
find_nb(135440716410000)
find_nb(40539911473216)我需要帮助的领域:
n值时,如何才能理解它
find_nb(24723578342962)发布于 2016-11-29 03:49:26
提示1:您不需要进入无穷大:在某个n之后,和将大于m,并且很快就会越走越远。
提示2:如果找到n,函数将永远不会到达它的最后一行,因为有return。
提示3:如果您到达next块的末尾,那么each是自动的。
提示4:每次都不需要从头开始重新计算立方体的总和。你不是在建造一个全新的建筑,你只是在下面放一个更大的立方体。
所以..。
def find_nb(m)
n = 1
sum = 1
while sum < m
n += 1
sum += n**3
end
return sum == m ? n : -1
end编辑:这是一个功能版本,但我认为上面的普通while仍然清晰得多(而且可能也更快):
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发布于 2016-11-29 04:33:37
修复/改进代码
要修复代码,请在if-statement中创建另一个分支,告诉迭代何时返回-1。next在each迭代中并不是必需的(指出这一点应该归功于@Amadan )。
注意,最好不要从方法定义中打印任何内容。调用方法时打印。压痕和间距得到了改善。还请注意,我正在定义变量total中多维数据集的和
def find_nb m
(1..Float::INFINITY).each do |n|
total = (1..n).inject(0) { |sum, value| sum + value**3 }
if total == m
return n
elsif total > m
return -1
end
end
end
find_nb 4183059834009 #=> 2022
find_nb 135440716410000 #=> 4824
find_nb 40539911473216 #=> 3568
find_nb 37 #=> -1进一步改进
如果您希望使用无限循环,Ruby有loop。将此与with_index一起使用如下:
def find_nb m
loop.with_index(1) do |_,n|
t = (1..n).inject { |sum,i| sum + i**3 }
if t == m
return n
elsif t > m
return -1
end
end
end
find_nb 4183059834009 #=> 2022
find_nb 135440716410000 #=> 4824
find_nb 40539911473216 #=> 3568
find_nb 37 #=> -1https://stackoverflow.com/questions/40857191
复制相似问题