我有以下程序,该程序应计算人口增长到所需大小所需的年数。每当我运行这个时,我就会得到一个无限循环。有人可以帮我识别我的错误吗?
def pop_growth(start, percent, desired)
year_count = 0
while start <= desired
year_count += 1
start = start + (start * (percent / 100))
end
return year_count
end
答案 0 :(得分:2)
我确定你正在尝试整数(而不是浮动),所以你正在失去精确度试试这个
def pop_growth(start, percent, desired)
year_count = 0
while start <= desired
year_count += 1
start = start + (start * (percent.to_f / 100))
end
return year_count
end
让我知道它是否适合你。如果没有,你能告诉我你的开始,百分比和期望值吗?
答案 1 :(得分:2)
Horacio给出了正确的答案,让我用惯用的红宝石重写:
def pop_growth start, percent, desired
(0..Float::INFINITY).inject(start) do |memo, years|
break years if memo > desired
memo *= (1.0 + percent / 100.0)
end
end
或者,无限循环:
def pop_growth start, percent, desired
loop.each_with_object(years: 0, count: start) do |_, memo|
break memo[:years] if memo[:count] > desired
memo[:years] += 1
memo[:count] *= (1.0 + percent / 100.0)
end
end
答案 2 :(得分:2)
三种方式。
#1解决等式
为desired = start * (1.0 + 0.01 * percent)**n
解析n
:
def pop_growth(start, percent, desired)
Math.log(desired.to_f/start)/Math.log(1.0 + percent/100.0)
end
years = pop_growth(100, 10, 200)
#=> 7.272540897341713
years.ceil #=> 8
如果需要。
#2化合物直到满足欲望
def pop_growth(start, percent, desired)
return 0 if start >= desired
alpha = 1.0 + 0.01 * percent
1.step.find { (start *= alpha) >= desired }
end
pop_growth 100, 10, 200
#=> 8
#3使用递归
def pop_growth(start, percent, desired, years=0)
return years if start >= desired
pop_growth(start*(1.0+0.01*percent), percent, desired, years+1)
end
pop_growth 100, 10, 200
#=> 8
答案 3 :(得分:0)
只需将.to_f
方法添加到百分比或除以100.0
,这会将整数转换为浮点数。
start + (start * (percent / 100))
当你要分割时,你需要至少一个浮点数才能返回精确的除法答案,否则Ruby会将它向下舍入到最接近的整数,在这种情况下percent / 100
将得到0,假设百分比值小于100.这将导致此语句start + (start * (percent / 100))
变为start = start + 0
,这就是您看到无限循环的原因。