【问题标题】:All_else method (Ruby)All_else 方法 (Ruby)
【发布时间】:2021-01-06 08:18:54
【问题描述】:

我正在尝试创建一个方法,该方法遍历一个数组并将其所有元素相加并返回为其总和一半的元素,否则它将返回 nil。

例子:

p all_else_equal([2, 4, 3, 10, 1]) #=> 10, because the sum of all elements is 20
p all_else_equal([6, 3, 5, -9, 1]) #=> 3, because the sum of all elements is 6
p all_else_equal([1, 2, 3, 4])     #=> nil, because the sum of all elements is 10 and there is no 5 in the array.

我的解决方案是遍历数组并使用“sum”变量将每个元素相加。然后编写一个条件语句,说明如果总和的一半包含在 arr 中,则返回元素,否则返回 nil。但是对于任何重新赛季,我一直得到“零”。有谁能告诉我为什么这是错误的?这是我的代码:

def all_else_equal(arr)
  sum = 0
  sum_half = sum / 2  

  arr.each_with_index do |ele, i|
    sum += ele    

    if sum_half == ele
      return ele
    else
      return nil
    end
  end
end

控制台:

nil

【问题讨论】:

    标签: arrays ruby methods


    【解决方案1】:

    因此您的代码将在第一个值之后立即返回 nil。这是因为 返回条件在循环中。要解决此问题,请将其移出,如下所示。 另外,在总和已经创建之后创建 sum_half 变量 评估:

    def all_else_equal(arr)
      sum = 0
    
      arr.each_with_index do |ele, i|
        sum += ele    
      end
    
      sum_half = sum / 2  
    
      if arr.include?(sum_half) #check if sum_half in array
          return sum_half
      else
          return nil
      end
    end
    
    p all_else_equal([2, 4, 3, 10, 1]) #=> 10, because the sum of all elements is 20
    p all_else_equal([6, 3, 5, -9, 1]) #=> 3, because the sum of all elements is 6
    p all_else_equal([1, 2, 3, 4])     #=> nil, because the sum of all elements is 10 and there is no 5 in the array.
    

    一个更简单的选择:

    def all_else_equal(arr)
      sum_half = arr.sum / 2  
      arr.include?(sum_half) ? sum_half : nil
    end
    p all_else_equal([2, 4, 3, 10, 1]) #=> 10, because the sum of all elements is 20
    p all_else_equal([6, 3, 5, -9, 1]) #=> 3, because the sum of all elements is 6
    p all_else_equal([1, 2, 3, 4])     #=> nil, because the sum of all elements is 10 and there is no 5 in the array.
    
    

    【讨论】:

    • 非常感谢。这是我第一次使用这个网站。我很高兴有人在这里不仅告诉我正确的答案,而且告诉我为什么我错了。您的所有回答都非常有帮助。
    • 鉴于您的“更简单的替代方案”,我认为您更喜欢,为什么还要提到第一种方法?
    【解决方案2】:

    我在这里看到了一些东西。首先,在 Ruby 和所有命令式语言中,变量赋值仅在执行时进行评估——因此您的 sum_half 变量将始终等于 0 / 20。它不会动态重新评估以始终等于sum / 2。您需要在循环的每次迭代后重新计算它以使其准确。

    其次,从逻辑的角度来看,您的sum 变量实际上只是到目前为止的总和。检查它的一半是否等于当前元素不是您想要做的,因为即使这是真的,也不意味着当前元素是 final 总和的一半。相反,您可能希望找到完整的总和,将其一分为二,然后查找与该值匹配的元素。

    此外,从风格上讲,您的 each_with_index 目前是不必要的,因为您根本没有使用索引 - 将其更改为 each,直到您找到该索引值的用途。

    【讨论】:

    • 非常感谢。这是我第一次使用这个网站。我很高兴有人在这里不仅告诉我正确的答案,而且告诉我为什么我错了。您的所有回答都非常有帮助。
    【解决方案3】:

    @RobertNubel 和 @PhiAgent 有很好的答案 - 我建议您特别注意 PhiAgent 的答案。

    我只会为循环的第一次迭代添加一个工作示例,这样你就可以准确地看到发生了什么

    带注释的工作示例:

    def all_else_equal(arr) ## let's say array = [1,2] is passed in as a parameter
      sum = 0              
      sum_half = sum / 2    ## => sum_half = 0
    
      arr.each_with_index do |ele, i|  # => elem = 1 (given the first element in the array)
        sum += ele         # => sum is now 1
    
        if sum_half == ele # => 0 == 1  ## this will be false
          return ele
        else
          return nil   # => nil be returned
        end
      end
    end
    

    @PhiAgent 有一个很好的解决方案来让代码正常工作。

    【讨论】:

    • 非常感谢。这是我第一次使用这个网站。我很高兴有人在这里不仅告诉我正确的答案,而且告诉我为什么我错了。您的所有答案都非常有帮助。
    猜你喜欢
    • 2010-09-13
    • 2018-08-07
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2011-07-05
    • 2015-12-26
    相关资源
    最近更新 更多