Ruby 尝试编写排序方法

Ruby 尝试编写排序方法,ruby,sorting,methods,recursion,Ruby,Sorting,Methods,Recursion,尝试通过使用递归编写自己的排序方法对数组进行排序(Pine的书)。在stackoverflow上看到了一些其他示例,但我的代码看起来与它们不同。到目前为止,有两件事我还不明白: 什么是包装器方法,为什么我需要一个?(我想我在密码里加了一个) 如何修复“堆栈级别太深”错误 编辑:新代码已更新,正常工作但不正确。 以下是我目前掌握的情况: def word_sorter unsorted, sorted if unsorted[1] == nil sorted.push unsorted

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

  • 什么是包装器方法,为什么我需要一个?(我想我在密码里加了一个)
  • 如何修复“堆栈级别太深”错误
  • 编辑:新代码已更新,正常工作但不正确。

    以下是我目前掌握的情况:

    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
    
    def word_分类器未排序,已排序
    如果未排序[1]==nil
    已排序。推送未排序[0]
    字数(已排序)
    elsif unsorted[0]“堆栈级别太深”意味着正在进行无限递归。在word_sorter的任何分支中,未排序的列表看起来都不会变短,因此它将永远运行。

    1)这里没有什么特别的事情。我们使用的是通俗易懂的英语(尽管是隐喻性的)。包装器方法是作为包装器的方法。包装物是一种包装物。您正在使用
    sort
    方法包装
    word\u sorter
    方法。您“需要”它是为了方便:当您从外部调用它时,
    sort
    方法期望它的第二个参数为空列表,这会很奇怪。包装考虑到递归的明显接口与外部世界的明显接口不同这一事实

    2) 仔细查看处理
    unsorted[0]>=unsorted[1]
    的代码与
    else
    情况(即
    unsorted[0]
    时)的不同之处

    3) 试着先用英语描述你的算法。然后试着拿出几张扑克牌,严格按照它来测试你的算法


    4) 工作排序算法只需调用一次。所以,制定一个合适的排序算法,然后只调用它一次——在循环外,在读入所有要排序的值之后。您可能还想实际调用
    单词\u put

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

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

    这个已经有两个问题了

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

  • 您试图实现什么排序算法?“包装器方法”不是Ruby术语。大概它指的是一个方法,它不做任何其他事情,而是以特定的方式调用不同的方法。至于“堆栈级别太深”,这可能意味着您的递归正在无限地发生,这意味着您结束递归的机制永远不会发生。使用两个数组,其中一个数组的原始单词的顺序与gets呈现的顺序相同,然后检查相邻的单词以获得排序数组中的正确顺序。它应该始终按“最低”字(先按a,然后按b等),直到剩下最高的字,最后按到排序的数组中。请在
    [2,3,1]
    上尝试您的算法。除非定义要排序的
    [2,1,3]
    ,否则它将无法正确运行;-)令人惊叹的!意识到真正的问题是我使用了错误的数组方法:ari.drop与ari.shift的工作原理不同,这正是我真正想要的。其他一些编辑使它工作得很好,但现在它在放入单词后继续返回get.chomp。谢谢同样,
    unsorted.push get.chomp
    部分应该是循环中唯一的部分。排序调用和显示调用应该在循环之后进行。否则就是滥用循环的语义。你能分享代码重写吗?我从我还在使用内置排序方法时编写的原始排序程序中获取了代码。谢谢!我最终研究了不同的排序算法,并做出了我发现的第一个:冒泡排序。我把结果发布在我的博客上,2,3,1在其中起作用。我发现原来的代码告诉我2比3低,但它不是最低的。有没有一种方法可以使用min方法只找到最低的字符串并推送到一个新数组?@podopie
    ['AXYZ','ABC','DEF'].min
    为您提供
    'ABC'