Руби: Я использую правильную область? - PullRequest
0 голосов
/ 22 сентября 2019

Я пришел из фона JavaScript и написал это так же, как в javascript.Я пишу это в Ruby.Это упражнение Codewars.n, равное 0, и 1 возвращает 0,00 и 1,00, как и ожидалось.Каждое другое положительное натуральное число возвращает 0.

# Task:
# Your task is to write a function which returns the sum of following series upto nth term(parameter).
# Series: 1 + 1/4 + 1/7 + 1/10 + 1/13 + 1/16 +...


# Rules:
# You need to round the answer to 2 decimal places and return it as String.
# If the given value is 0 then it should return 0.00
# You will only be given Natural Numbers as arguments.

# Examples:
# SeriesSum(1) => 1 = "1.00"
# SeriesSum(2) => 1 + 1/4 = "1.25"
# SeriesSum(5) => 1 + 1/4 + 1/7 + 1/10 + 1/13 = "1.57"


def series_sum(n)
    sum = 0
    if n == 0
        return 0.00
    elsif n == 1
        return 1.00
    else 
        n.times do |i|
            if i == 1 
                sum += 1
                break
            end 
            sum += 1/( 1 + (3 * (i - 1)) )
        end
    end
    return sum 
end

puts series_sum(0)
puts series_sum(1)
puts series_sum(2)
puts series_sum(4)
puts series_sum(5)

Ответы [ 3 ]

2 голосов
/ 22 сентября 2019

Обратите внимание на пару вещей: - В Ruby есть метод reduce, который может суммировать список чисел: https://apidock.com/ruby/Enumerable/reduce - Вам не нужно явно return из вашего метода.Ruby автоматически возвращает последнее утверждение в вашем методе.

Я изменил ваше решение, и это должно работать:

def series_sum(n)
  if n > 1
    sum = (1..n).inject { |sum, i| sum + (1/(1.to_f + (3 * (i - 1)))) }
  else
    sum = n
  end
  '%.2f' % sum
end

Когда вы ожидаете десятичное число в делении, всегда делайтеубедитесь, что числитель или знаменатель находится в плавающем, поэтому причина 1.to_f.«% .2f» - это строковый формат, обеспечивающий возврат окончательного ответа в 2 десятичных разрядах.

1 голос
/ 22 сентября 2019

Этот вопрос состоит из двух частей.

  1. Как отобразить результат операции в виде значения с плавающей запятой?

    1/2 # this will give 0
    1.0/2 # this will give 0.5
    
  2. Как ограничитьзначение с плавающей запятой до 2 знаков после запятой?
    Вы можете использовать функцию округления
     22.0/7 # this will give pi value - 3.142857142857143
     (22.0/7).round(2) # this will give 3.14
    
    Два ответа выше могут быть объединены, чтобы получить ваш ответ.Я хотел бы, чтобы вы разработали точный код для решения вашей проблемы.
0 голосов
/ 22 сентября 2019
def series_sum(n)
  return "0.00" if n.zero?
  sprintf("%.2f", (0..n-1).sum { |m| 1.fdiv(3*m+1) }.round(2))
end

series_sum(0) #=> "0.00" 
series_sum(1) #=> "1.00" 
series_sum(2) #=> "1.25" 
series_sum(3) #=> "1.39"
series_sum(4) #=> "1.49" 
series_sum(5) #=> "1.57" 

См. Ядро # sprintf .В качестве альтернативы можно использовать String% , который разделяет директивы форматирования sprintf:

"%.2f" % (0..n-1).sum { |m| 1.fdiv(3*m+1) }.round(2)

Я не знаю о существовании выражения в закрытой форме для этой частичной суммы.Хотя эта частичная сумма не относится к данному вопросу, можно показать, что она расходится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...