包含从1到N的数字的数组

我试图返回一个包含数字从1到N的数组,其中N永远不会小于1 ,并具有以下条件:

  • 如果该值是3的倍数:则改为使用值'Fizz'
  • 如果该值为5的倍数:请改为使用值'Buzz'
  • 如果该值是35的倍数:则改为使用值'FizzBuzz'
  • 这就是我现在所拥有的。 我正朝着正确的方向走吗?

    def fizzbuzz(n)
      x = [1..n]
      x.map { |i|
        if (i % 3 == 0 && i % 5 == 0)
          'FizzBuzz'
        elsif (i % 3 == 0 && i % 5 != 0) 
          'Fizz'
        elsif (i % 5 == 0 && i % 3 != 0)
          'Buzz'
        end
    
      puts x
    end
    

    在这么短的一段代码中,你有很多重要的错误和坏习惯。

  • [错误]你的{未关闭。
  • [错误]你有错误的对象[1..n]
  • [错误]你正试图用map创建一个数组,但不知何故,你对它没有做任何事情,而是在puts原始对象。 这没有意义。
  • [错误]当没有满足条件时,您还没有给出适当的值。
  • [重构]你的情况是多余的。 您只需要将(i % 3 == 0 && i % 5 == 0)条件放在开头,或者使用i % 5 != 0i % 3 != 0条件,但不能同时使用这两个条件。 前者更聪明。
  • [重构]您只使用一次x ,链接很简单。 你应该做链接。
  • [重构] zero? 可以使用的方法。
  • [重构]你有一些不必要的括号。
  • [风格]由于条件值足够短,可以将它们分别放在一行中。
  • [风格]当Ruby块超过单行时,使用do ... end而不是{ ... }在Rubyists中非常普遍。
  • 十三行中的四个错误非常多。 一个更正的代码将是:

    def fizzbuzz(n)
      (1..n).map do |i|
        if (i % 3).zero? && (i % 5).zero? then 'FizzBuzz'
        elsif (i % 3).zero? then               'Fizz'
        elsif (i % 5).zero? then               'Buzz'
        else                                   i
        end
      end
    end
    puts fizzbuzz(10)
    

    你在正确的方向。 最大的问题是数组定义。 下列:

    x = [1..n]
    

    ...将创建一个具有单个值的数组 - 一个1..n范围对象。

    任何这些都是有效的选择:

    x = 1..n          # no need for an array since you're using map
    x = (1..n).to_a   # converts the range to an array explicitly
    x = [*1..n]       # unsplats the range
    

    正如@sawa指出的那样,其他重大问题是一个未关闭的括号和使用map而不是map! (或者,使用x = x.map { … }或者简单地返回x.map { … }puts x.map { … }到函数之外)。


    一些代码优化,它只是萨瓦答案的附加部分:

    def fizzbuzz(n)
       x = Array.new(n) { '' }.map.with_index(1) do |v,i|
          v << 'Fizz' if (i % 3).zero?
          v << 'Buzz' if (i % 5).zero?
          v.empty? && i || v
       end
    end
    fizzbuzz(15)
    # => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"] 
    

    注释:

  • 创建一个新的数组,填充空值的第n维。
  • 由于索引从1开始,在循环中递增到1。
  • 使用三个条件我们为数组中的每一个设置一个适当的新值。
  • 该行v.empty? && i || v v.empty? && i || v v.empty? && i || v可以用v.empty? ? i : v替换v.empty? ? i : v v.empty? ? i : v v.empty? ? i : v ,但这是一个口味。 我更喜欢&& || 对。
  • 链接地址: http://www.djcxy.com/p/25655.html

    上一篇: Array containing numbers from 1 to N

    下一篇: Nested IF statement syntax