【问题标题】:Implementing Mergesort in Ruby Recursively在 Ruby 中递归实现合并排序
【发布时间】:2016-06-23 14:55:42
【问题描述】:

在过去的几个月里,我一直在自学编程,我终于学会了递归。现在,我应该递归地实现Mergesort。我已经完成了我的研究并了解了应该发生的事情,但是我的代码存在一些问题。在这一点上,我不想只查找答案,因为我更感兴趣的是找出我做错了什么,而不仅仅是得到答案。我一直收到一个没有方法的错误说

[6]:Array 的未定义方法 `>'

我现在的代码是这样的:

def merge_sort(arr)
  n = arr.length
  p = n/2
  q = p - 1
  return arr if n == 1

  l1 = arr[0..q]
  l2 = arr[p..n]

  l1 = merge_sort(l1)
  l2 = merge_sort(l2)

  return merge(l1, l2)
end

def merge(arr_1, arr_2)
  arr_3 = []
  while !arr_1.empty? && !arr_2.empty?
    if arr_1[0] > arr_2[0]
      arr_3 << arr_2[0]
      arr_2.delete_at(0)
    else
      arr_3 << arr_1[0]
      arr_1.delete_at(0)
    end
  end

  if arr_1.length == 0
    arr_3 << arr_2[0..-1]
  elsif arr_2.length == 0
    arr_3 << arr_1[0..-1]
  end

  arr_3
end

puts merge_sort([2, 6, 4, 5, 7, 9, 8, 3])

【问题讨论】:

  • 我猜错误指向if arr_1[0] &gt; arr_2[0]。尝试使用 gem pry 进行调试。在文档顶部require 'pry',然后在该行之前添加binding.pry 并从终端运行。然后您就可以输入arr_1arr_2 来查看这些变量的值
  • 请将代码格式化/对齐,缩进 2 个空格以使其可读。谢谢。
  • 感谢您的回复。在 while 循环之前,我通过执行 p arr_1 和 p arr_1[0] 尝试了类似的操作,并且 6 作为 fixnum 而不是数组返回,但我也会尝试您的建议!

标签: ruby recursion mergesort


【解决方案1】:

您的 arr_3 包含数组数组。你需要在merge方法的最后一行把它展平

arr_3.flatten

另外,我建议使用有助于理解方法的变量名。您还应该查看Array 类必须提供的各种方法,因为其中一些方法可用于编写简洁的代码。例如,下面是一种尝试重写您的 merge 方法,保持逻辑与您所​​拥有的相同。这里我们使用Array#concat方法避免arr_3变成数组数组

def merge(left, right)

  merged_array = []
  while !left.empty? && !right.empty?
    if left.first > right.first
      merged_array << right.shift
    else
      merged_array << left.shift
    end
  end

  if left.empty?
    merged_array.concat right
  else
    merged_array.concat left
  end

  merged_array
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2021-11-06
    • 2019-01-22
    相关资源
    最近更新 更多