Въпроси по Scheme

Problem s 2 zadacha ot kontrolnoto po prakt-zachiklq

Problem s 2 zadacha ot kontrolnoto po prakt-zachiklq

от Svetlana Goranova -
Number of replies: 1

(define (enum a b )
  (if(=(+ a 1 ) b )()
     (cons (+ a 1) (enum (+ a 1) b))))

(define (append x y )
  (begin
     (set-cdr! (last x) y)x))
(define (insert1 l l1 )
  (if(null? l1) l
    (if(=(+(car l1) 1) (cadr l1))
       (insert1 l (cdr l1))
       (begin
         (set-cdr! l1 (append (enum (car l1) (cadr l1))(cdr l)))
         (insert1 l (cdr l1))))))
        

In reply to Svetlana Goranova

Re: Problem s 2 zadacha ot kontrolnoto po prakt-zachiklq

от Трифон Трифонов -

Здрасти,

  първо да кажа, че идеята за решението е добра. Грешката поради която зацикля е на реда:

(set-cdr! l1 (append (enum (car l1) (cadr l1))(cdr l)))

Трябва да се смени на:

(set-cdr! l1 (append (enum (car l1) (cadr l1))(cdr l1)))

Иначе завързваш по някое време края на списъка за началото му и получаваш зациклена структура. Освен това има още един проблем - в началото на функцията insert1 вземаш cadr на l1, а не си сигурна, че има такъв. Затова е добре да промениш проверката (null? l1) на (null? (cdr l1)).

Изобщо първият параметър на функцията ти е излишен, мисля, че го използваш само за да връщаш списъка на края на процеса, но това можеш да го направиш, като добавиш l1 най-накрая във тялото на insert1. Така функцията винаги ще ти връща параметъра си, върху който е работила деструктивно.