Mam problemy z duplikowaniem symbolu. Zasadniczo mam listę i muszę otoczyć go taką samą liczbą symbolu @ jako liczby elementów na liście.

Na przykład:

(display(frontenddupe '@ '((! % % % !)(! % ! % !))))

I mam przypuszczać, że następuje:

((@ @ @ @ @)(! % % % !)(! % ! % !)(@ @ @ @ @))

To mój kod, który mam do tej pory:

(define (frontenddupe s lst)
 (define (duplicate n s)
  (cond`]
    [(zero? n) '()]
    [else (append (list s (duplicate (- n 1) s)))]))

(append (list (list (duplicate (length lst) '@ ))(list s) lst (list (list s)))))

Wiem, że to jest całkowicie złe, ale jestem w całości zagubionym, jak go naprawić.

0
Jay 10 październik 2020, 08:22

1 odpowiedź

Najlepsza odpowiedź

Możesz napisać rozwiązanie bez użycia wyraźnej rekurencji, wystarczy użyć niektórych wbudowanych procedur - takich jak:

(define (frontenddupe s lst)
  (let* ([len (length (first lst))] ; assuming all lists have same length
         [dup (build-list len (λ (n) s))])
    (append (cons dup lst) (list dup))))

Działa zgodnie z oczekiwaniami:

(frontenddupe '@ '((! % % % !) (! % ! % !)))
=> '((@ @ @ @ @) (! % % % !) (! % ! % !) (@ @ @ @ @))
2
Óscar López 10 październik 2020, 20:04