Функция сортировки пузырьков в ракетке - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь создать функцию bubble, которая принимает (listof Num) и возвращает список после 1 прохода сортировки пузыря.Вот мой кодпустой список как основа этой пузырьковой функции.Что я сделал не так?Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы правы, что b здесь список.Но как насчет других аргументов append, таких как a или (list-ref b 0)?

Об этих вещах легче думать, если вы ставите подписи на своих функциях, чтобы показать, что они принимают в качестве аргументов и что они возвращают.Вы сказали, что bubble принимает (Listof Num) и возвращает список после 1 прохода пузырьковой сортировки.Почему бы не записать это в коде?

;; bubble : (Listof Num) -> (Listof Num)
;; returns the list after 1 pass of bubble sort
(define (bubble L)
  ...)

Вы должны сделать то же самое для своей вспомогательной функции, check-numbers-size.Вы сказали, что b - это список:

;; check-numbers-size : ??? (Listof Num) -> ???

И поскольку вы используете (cons a b) в теле, я предполагаю, что вы хотели, чтобы a был Num, чтобы функциявозвращает (Listof Num).

;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
  ...)

Теперь, когда мы знаем, что a является Num, а b является (Listof Num), мы можем выяснить, каковы аргументы append,Причиной проблемы могут быть два append вызова:

  1. (append a (rest b))
  2. (append (list-ref b 0) (append a (rest b)))

Is (1)Хорошо?Если a - это Num, а b - это (Listof Num), то (1) пытается вызвать append для Num и (Listof Num).Это первый аргумент, a, это проблема, а не b.Похоже, вы хотели использовать cons вместо.

С (2) все в порядке?Если b является (Listof Num), тогда (list-ref b 0) будет Num.Таким образом, похоже (2) пытается вызвать append на Num и (Listof Num).Как и (1), это первый аргумент, который является проблемой.И опять же, похоже, что вы намеревались использовать cons.

Функция cons имеет сигнатуру X (Listof X) -> (Listof X), где X может быть любого типа, например Num.Если вы используете cons вместо append всякий раз, когда хотите добавить одиночное число в список, ваш код делает то, что вы ожидаете:

;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
  (cond
    [(empty? b) (cons a b)]
    [(> a (list-ref b 0)) (cons (list-ref b 0) (cons a (rest b)))]
    [else (cons a b)]))
0 голосов
/ 11 июня 2018

Функция append ожидает два списка в качестве входных данных.

> (append (list 1 2 3) (list 4 5))
(list 1 2 3 4 5)

Функция list-ref извлекает один элемент из списка:

> (list-ref (list 10 11 12 13 14) 2)
12

В вашем коде вы имеетевыражение:

(append (list-ref b 0) ...)

Проблема здесь в том, что (list-rf b 0) возвращает элемент, а не список.Чтобы создать новый список из элемента и списка, вам нужно использовать конструктор списка cons.

(cons (list-ref b 0) ...)

Обратите внимание, что у вас есть похожая проблема в выражении

(append a ...)
...