【问题标题】:Trying to write sort method尝试编写排序方法
【发布时间】:2011-06-16 04:55:18
【问题描述】:

尝试通过使用递归(Pine 的书)编写我自己的排序方法来对数组进行排序。在 stackoverflow 上看到了一些其他示例,但我的代码看起来与它们不同。到目前为止我不明白的两件事:

  1. 什么是包装器方法,为什么需要包装器方法? (我认为是我在代码中添加的)。
  2. 如何修复“堆栈级别太深”错误。

编辑:新代码已更新,可以工作但不正确。

这是我目前所拥有的:

def word_sorter unsorted, sorted
  if unsorted[1] == nil
    sorted.push unsorted[0]
    words_put(sorted)
  elsif unsorted[0] <= unsorted[1]
    sorted.push unsorted[0]
    unsorted.shift
    word_sorter(unsorted, sorted)
  else
    unsorted.push unsorted[0]
    unsorted.shift
    word_sorter(unsorted, sorted)
  end
end

def words_put sorted
  puts 'these are your words now organized.'
  sorted.compact!
  puts sorted.join(', ')
  Process.exit
end

unsorted = Array.new
sorted = Array.new
puts 'list as many words as you want. I will sort them... I think'
while unsorted.last != ''
  unsorted.push gets.chomp
  if unsorted.last == ''
    unsorted.pop
    word_sorter(unsorted, sorted)
  end
end

谢谢!

【问题讨论】:

  • 你想实现什么排序算法?
  • “包装方法”不是 Ruby 术语。据推测,它指的是一种不做任何其他事情但以特定方式调用不同方法的方法。至于“堆栈级别太深”,这可能意味着您的递归正在无限发生,这意味着您结束递归的机制永远不会发生。
  • 使用两个数组,其中一个以gets 呈现的顺序包含原始单词,然后检查彼此相邻的单词以在排序后的数组中获得正确的顺序。它应该总是压入“最低”(先是 a,然后是 b 等)单词,直到剩下最高的单词,然后最终将其压入排序数组。
  • 请在[2,3,1] 上尝试您的算法。除非您定义要排序的[2,1,3],否则它将无法正确运行;-)

标签: ruby sorting methods recursion


【解决方案1】:

1) 这里没有什么特别的。我们使用的是简单的英语(尽管是隐喻的)。包装器方法是一种包装器方法。包装器是包装的东西。您正在用sort 方法包装word_sorter 方法。为了方便起见,您“需要”它:当您从外部调用 sort 方法时,它的第二个参数期望一个空列表是很奇怪的。包装考虑到递归的明显接口与外部世界的明显接口不同。

2) 仔细看看处理unsorted[0] &gt;= unsorted[1] 的代码与else 情况的不同之处(即unsorted[0] &lt; unsorted[1] 时)。

3) 首先尝试用英语描述您的算法。然后试着拿出几张纸牌,并按照它来测试你的算法。

4) 工作排序算法只需调用一次。所以制定一个适当的排序算法,然后只调用一次 - 在循环之外,在你读入所有要排序的值之后。您可能还想实际致电words_put

【讨论】:

  • 太棒了!意识到真正的问题是我使用了错误的数组方法:ary.drop 与 ary.shift 的工作方式不同,而这正是我真正想要的。其他一些编辑使它工作得很好,除了现在它在放置单词后不断回到gets.chomp。谢谢!
  • 同样,unsorted.push gets.chomp 部分应该是循环内的唯一内容。排序调用和显示调用应该在循环之后进行。否则就是滥用循环的语义。
  • 你能分享代码重写吗?我从我还在使用内置排序方法时编写的原始排序程序中获取代码。
【解决方案2】:

您应该首先通过一些简单的示例来尝试您的代码。例如。使用列表 [3,2,1] 作为输入。

在第一次调用中,它将匹配3&gt;=2 条件。因此现在sorted=[2]

这个已经有两个问题了。

  1. 2 不是排序列表中的第一个条目。一定是您的算法无法对任何输入进行排序存在问题。
  2. 数组unsorted 根本没有改变,因此它将永远循环这个数组,产生sorted=[2,2,2,2,2.....]

【讨论】:

  • 谢谢!我最终研究了不同的排序算法,并做出了我发现的第一个算法:冒泡排序。我将结果发布在我的博客上,其中 2,3,1 有效。我发现原始代码告诉我 2 低于 3,但它不是最低的。有没有办法使用 min 方法找到最低的字符串并推送到新数组?
  • @podopie ['AXYZ', 'ABC', 'DEF'].min 给你'ABC'
【解决方案3】:

“堆栈级别太深”意味着您正在进行无限递归。在 word_sorter 中的任何分支中,未排序列表似乎都不会变短,因此它将永远运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多