Попытка написать метод сортировки - PullRequest
1 голос
/ 16 июня 2011

Попытка отсортировать массив, написав собственный метод сортировки с использованием рекурсии (книга Пайна).Видел некоторые другие примеры на 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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

1) Здесь ничего особенного не происходит.Мы используем простой английский (хотя и в переносном смысле).Метод обертки - это метод, который является оберткой.Обертка - это вещь, которая обертывает.Вы оборачиваете метод word_sorter методом sort.Вам «нужно» это для удобства: было бы странно, если бы метод sort ожидал пустой список для своего второго параметра при вызове его извне.Обтекание учитывает тот факт, что очевидный интерфейс для рекурсии отличается от очевидного интерфейса для внешнего мира.

2) Внимательно посмотрите, как код для обработки unsorted[0] >= unsorted[1] отличается от else case (т.е. когда unsorted[0] < unsorted[1]).

3) Попробуйте сначала описать свой алгоритм на английском языке.А затем попробуйте выпустить несколько игральных карт и проверить свой алгоритм, следуя ему, до буквы.

4) Рабочий алгоритм сортировки нужно будет вызывать только один раз.Поэтому разработайте правильный алгоритм сортировки, а затем вызывайте его только один раз - вне цикла, после того как вы прочитали все значения для сортировки.Вы также можете позвонить words_put.

0 голосов
/ 16 июня 2011

Сначала вы должны попробовать свой код на нескольких простых примерах. Например. используйте список [3,2,1] в качестве ввода.

При первом вызове оно будет соответствовать условию 3>=2. Таким образом, теперь sorted=[2].

Уже есть две проблемы с этим.

  1. 2 не первая запись в отсортированном списке. Должна быть проблема в том, что ваш алгоритм не может отсортировать входные данные.
  2. Массив unsorted вообще не изменяется, и поэтому он будет зацикливаться на этом вечно, давая sorted=[2,2,2,2,2.....].
0 голосов
/ 16 июня 2011

«Уровень стека слишком глубокий» означает, что у вас бесконечная рекурсия. Не похоже, что несортированный список становится короче в любой из ваших веток в word_sorter, поэтому он будет работать вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...