В DrRacket, как мне изменить мою программу, которая использует операторы if, чтобы использовать условный оператор - PullRequest
0 голосов
/ 19 июня 2019

Вот вопрос, который я пытаюсь решить

Написать функцию (last-substring-len s n).

Он потребляет Str и Nat и возвращает подстроку s с длиной n, которая идет в алфавитном порядке.

Не забудьте подумать, требует ли ваша функция что-либо из своих аргументов!

Например:

(last-substring-len "foobar" 4) => "ooba"

(last-substring-len "thequickbrownfoxjumpsoverthelazydogs" 7) => "xjumpso"

Я фактически почти решил свой вопрос, но хочувместо этого можно изменить мой код так, чтобы операторы if для функции get-maximium были заменены на операторы cond.

Это мой оригинальный код:

(define (substrings-w-len s n)
  (cond
  [(> n (string-length s)) '()]
   [ else (cons (substring s 0 n)
            (substrings-w-len (substring s 1 (string-length s)) n))]))


(define (get-maximium string-list)
  (if(null? string-list) '()
  (if(= 1( length string-list)) string-list
  (if (equal? #true (string>=? (first string-list) (first (rest string-list))))
                  (get-maximium (cons (first string-list) (rest (rest string-list))))
                  (get-maximium (rest string-list))))))

(define (last-substring-w-len s n)
  ( get-maximium (substrings-w-len s n)))

(check-expect (last-substring-w-len "foobar" 4) "ooba")

Это дает (list "ooba")когда он должен давать только «ooba», поэтому мне нужно преобразовать список в строку, которую я смогу решить самостоятельно, но я был бы признателен, если бы кто-то мог помочь мне с этим.

Основная проблема сейчас, хотяя хочу заменить оператор if в get-Maximum условным оператором

Это я изменяю функцию get-maximium, чтобы попытаться заменить функции if на оператор cond, но он пока не работает.

(define (get-maximium string-list)
  (cond
  [(null? string-list) '()]
  [(= 1( length string-list)) string-list]
  [ else (equal? #true (string>=? (first string-list) (first (rest string list))))
                  (get-maximium (cons (first string-list) (rest (rest string-list))))
                  (get-maximium (rest string-list))]))

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Есть проблема с частью else. Это должно выглядеть так:

(define (get-maximium string-list)
  (cond [(null? string-list) '()]
        [(= 1 (length string-list)) string-list]
        [(string>=? (first string-list) (first (rest string list)))
         (get-maximium (cons (first string-list) (rest (rest string-list))))]
        [else (get-maximium (rest string-list))]))

Кроме того, нет необходимости спрашивать (equal? #t <condition>), просто спросите <condition>.

0 голосов
/ 19 июня 2019

Попробуйте получить первый элемент ответа следующим образом:

(define (last-substring-w-len s n)
  (first ( get-maximium (substrings-w-len s n))))

(last-substring-w-len "foobar" 4) => "ooba"
(last-substring-w-len "thequickbrownfoxjumpsoverthelazydogs" 7) => "xjumpso"

Подробное объяснение см. мой ответ здесь

...