Как получить доступ к определенной позиции в списке ракеток - PullRequest
0 голосов
/ 22 октября 2018

У меня проблемы с получением нужной мне позиции в списке.Я не уверен, что использовать, чтобы иметь возможность получить значение из заданной позиции.Если бы это был питон, я мог бы повторить (кулак (отдых n) столько раз, сколько я хотел, но вот ракетка, я запутался.

(check-expect (get-char "abcdefg" 0) #\a)
(check-expect (get-char "abcdefg" 3) #\d)
(check-expect (get-char "abcdefg" 20) #\*)
(define (list-of-char string-input)
  (string->list string-input))
(define (get-char string-input position)
  (cond [(empty? (list-of-char string-input)) #\*]
        [(> position (string-length string-input)) #\*]
        [else (cond
                [
                   [else (get-char (rest (list-of-char string-input)) position)])])

1 Ответ

0 голосов
/ 22 октября 2018

В вашем коде есть несколько ошибок.Для начала вы должны уменьшить позицию при продвижении рекурсии и преобразовать строку в список только один раз, в начале.

Кроме того, вы не правильно проверяете, достигли ли вы ожидаемогоposition - оставшаяся длина не эквивалентна позиции, которую вы хотите найти.И эта else/cond/else часть в конце не имеет смысла, и у нее слишком много скобок.

В «Схеме» с нуля, как правило, для рекурсии обычно используется имя let, но я будудля простоты используйте вспомогательную процедуру:

(define (get-char string-input position)
  ; convert to a list only once at the beginning
  (loop (string->list string-input) position))

(define (loop list-of-char position)
        ; there are two exit conditions we need to check
  (cond [(or (empty? list-of-char)
             (negative? position)) #\*]
        ; we found the element
        [(zero? position) (first list-of-char)]
        ; keep looking
        [else (loop (rest list-of-char) (sub1 position))]))

И мы можем написать более идиоматическое решение, используя встроенные процедуры:

(define (get-char string-input position)
  (if (or (negative? position)
          (>= position (string-length string-input)))
      #\*
      (string-ref string-input position)))

В любом случае, оно работает как положено:

(get-char "abcdefg" -1)
; => #\*

(get-char "abcdefg" 0)
; => #\a

(get-char "abcdefg" 3)
; => #\d

(get-char "abcdefg" 6)
; => #\g

(get-char "abcdefg" 7)
; => #\*
...