Ruby中的因子

时间:2014-09-28 19:35:27

标签: ruby

我试图在Ruby程序中做一个阶乘的总和。而且我无法解决。一个澄清,当他们用完点....意味着逻辑是好的。如果你在其中一个点得到一个F,那就意味着逻辑是错误的。

编写一个程序来计算1 + 1 /(2!)+ 1 /(3!)+ 1 /(4!)+ .... + 1 /(n!)之和对于给定的n。以两种方式编写程序:使用While,For

def factorial(n)
#(n == 0) ? 1 : n * factorial(n - 1)
fact = 1
for i in 1..n
  fact = fact * i
end
return fact
end

def sumatoriaWhile(n)
 total = n
 sumatoria = 0.0
 while n > 1
 total = total * (n - 1)
 n = n - 1
 sumatoria =sumatoria + total.to_f
 end
 return (1 + (1 / total.to_f)).round(2)
end

def sumatoriaFor(n)
 fact = 1
 sumatoria = 0.0
 for i in 1..n
  for j in 1..i
    fact = fact * j
  end
  sumatoria = sumatoria + (1 / fact.to_f)
  i = i + 1
 end
 return sumatoria.round(2)
end

#--- zona de test ----

def test_factorial
print validate(120, factorial(5)) 
print validate(5040, factorial(7)) 
print validate(362880, factorial(9)) 
end

def test_sumatoriaWhile
 print validate(1.50, sumatoriaWhile(2))
 print validate(1.83, sumatoriaWhile(3))
end

def test_sumatoriaFor
 print validate(1.50, sumatoriaFor(2))
 print validate(1.83, sumatoriaFor(3))
end

def validate (expected, value)
 expected == value ? "." : "F"
end

def test 
 puts "Test program"
 puts "---------------------------"
 test_factorial
 test_sumatoriaWhile
 test_sumatoriaFor
 puts " "
end

test

2 个答案:

答案 0 :(得分:0)

我很难弄清楚你在求和函数中做了什么。这是一个简单的功能:

def sumatoriaFor(n)
  return 0 if n <= 0
  factorial = 1
  sum = 0.0
  for i in 1..n
    factorial *= i
    sum += 1.0 / factorial.to_f
  end
  return sum.round(2)
end

def sumatoriaWhile(n)
  return 0 if n <= 0
  i = 1
  factorial = 1
  sumatoria = 0.0
  while i <= n
   factorial *= i
   sumatoria += (1.0 / factorial.to_f)
   i = i + 1
  end
  return sumatoria.round(2)
end

现在看起来也是直截了当的。你的验证也是错误的:

1 + 1/2 + 1/6 ~= 1 + 0.5 + 0.17 = 1.67

答案 1 :(得分:0)

我的朋友,谢谢您的及时回复。首先,我感谢给予的帮助。我正在学习ruby编程,希望像你和其他人一样学习更多知识。如果确实答案是错的。我修改了答案。而且还需要知道While的功能是什么。我再次修改程序。现在我得到了WHILE的一部分。

def factorial(n)
fact = 1
for i in 1..n
  fact = fact * i
end
return fact
end

def sumatoriaWhile(n)
 total = n
 sumatoria = 0.0
while n < 1
 total = total * (n - 1)
 sumatoria = sumatoria + (1.0 / total.to_f)
 n = n - 1
end
return sumatoria.round(2)
end

def sumatoriaFor(n)
  fact = 1
  sumatoria = 0.0
  for i in 1..n
     fact = fact * i
     sumatoria = sumatoria + (1.0 / fact.to_f)
  end
  return sumatoria.round(2)
end

#--- zona de test ----

def test_factorial
print validate(120, factorial(5)) 
print validate(5040, factorial(7)) 
  print validate(362880, factorial(9)) 
end

def test_sumatoriaWhile
print validate(1.50, sumatoriaWhile(2))
print validate(1.67, sumatoriaWhile(3))
end

def test_sumatoriaFor
print validate(1.50, sumatoriaFor(2))
print validate(1.67, sumatoriaFor(3))
end

def validate (expected, value)
expected == value ? "." : "F"
end

def test 
puts "Test de prueba del programa"
puts "---------------------------"
test_factorial
test_sumatoriaWhile
test_sumatoriaFor
puts " "
end

test