无限的循环在红宝石

时间:2016-08-03 03:45:00

标签: ruby loops math infinite

我有以下程序,该程序应计算人口增长到所需大小所需的年数。每当我运行这个时,我就会得到一个无限循环。有人可以帮我识别我的错误吗?

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

4 个答案:

答案 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,这就是您看到无限循环的原因。