Vra

Ek probeer om terugsporing-soektog in skema te implementeer. Tot dusver het ek die volgende:

(define (backtrack n graph assignment)  
    (cond (assignment-complete n assignment) (assignment) )

    (define u (select-u graph assignment))

    (define c 1)
    (define result 0)

    (let forLoop ()
        (when (valid-choice graph assignment c)
             (hash-set! assignment u c)

             (set! result (backtrack n graph assignment))

             (cond ((not (eq? result #f)) result))

             (hash-remove! assignment u)            
        )

        (set! c (+ c 1))
        (when (>= n c) (forLoop))
    )

   #f ; I believe this is where I'm having problems
)

My funksies Opdrag-volledige en Select-U Pass-eenheidstoetse. Die argumentopdrag is 'n hash-tafel-maak met (makehash), so dit moet goed wees.

Ek glo dat die probleem wat ek het, verband hou met die terugkeer van vals aan die einde van die lus, indien geen rekursiewe 'n nie-valwaarde (wat 'n geldige opdrag moet wees) teruggee nie. Is daar 'n skema -ekwivalent van 'n eksplisiete terugkeerverklaring?

Was dit nuttig?

Oplossing

Die antwoord op u vraag is ja:

(define (foo ...)
  (call-with-current-continuation
    (lambda (return)
      ...... ; here anywhere inside any sub-expression 
      ...... ; you can call (return 42)
      ...... ; to return 42 from `foo` right away
    )))

Dit stel 'n uitgaan voortsetting Sodat u 'n resultaatwaarde van binne die liggaam van 'n funksie kan terugstuur. Die gewone skema -manier is om u opbrengsvorm as die laaste een te plaas, sodat die waarde daarvan teruggestuur word:

    (let forLoop ()
        (when (valid-choice graph assignment c)
             (hash-set! assignment u c)
             (set! result (backtrack n graph assignment))
             (cond
                 ((not (eq? result #f))
                   result))       ; the value of `cond` form is ignored
             (hash-remove! assignment u))
                                  ; the value of `when` form is ignored
        (set! c (+ c 1))
        (if (>= n c)     ; `if` must be the last form 
           (forLoop)     ; so that `forLoop` is tail-recursive
           ;; else:
           return-value) ; <<------ the last form's value 
    )                    ; is returned from `let` form

   ;; (let forLoop ...) must be the last form in your function
   ;;                   so its value is returned from the function
)

U het ook 'n probleem hier:

(cond (assignment-complete n assignment) (assignment) )

Hierdie kode doen dit nie maak 'n oproep (assignment-complete n assignment). Dit kyk of dit 'n veranderlike is assignment-complete het 'n nie-nulwaarde, en indien nie, kontroleer dit assignment veranderlik, maar die terugbesorgde waarde daarvan word in elk geval net geïgnoreer. Miskien ontbreek nog 'n paar hakies daar, en/of 'n else klousule.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top