В вашем коде есть несколько ошибок.Для начала вы должны уменьшить позицию при продвижении рекурсии и преобразовать строку в список только один раз, в начале.
Кроме того, вы не правильно проверяете, достигли ли вы ожидаемого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)
; => #\*