سؤال

أحاول تنفيذ البحث في المخطط. حتى الآن ، لدي ما يلي:

(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
)

وظائف التخصيص الخاصة بي واختبار وحدة تمرير UNS SELECT-U. مهمة الوسيطة عبارة عن طاولة تجزئة مع (Make) ، لذلك يجب أن تكون على ما يرام.

أعتقد أن المشكلة التي أواجهها مرتبطة بإرجاع FALSE في نهاية الحلقة ، إذا لم تُرجع أي عودية قيمة غير قسرية (والتي يجب أن تكون مهمة صالحة). هل هناك مخطط مكافئ لبيان العودة الصريح؟

هل كانت مفيدة؟

المحلول

إجابة سؤالك نعم:

(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
    )))

هذا يضع خروج استمرار بحيث يمكنك إرجاع قيمة النتيجة من داخل جسم الوظيفة. طريقة المخطط المعتاد هي وضع نموذج الإرجاع الخاص بك كآخر ، لذلك يتم إرجاع قيمته:

    (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
)

لديك أيضًا مشكلة هنا:

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

هذا الرمز يفعل ليس إجراء مكالمة (assignment-complete n assignment). بدلاً من ذلك ، يتحقق مما إذا كان المتغير assignment-complete له قيمة غير خالية ، وإذا لم يكن التحقق من ذلك assignment متغير ، ولكن على أي حال يتم تجاهل القيمة التي تم إرجاعها على أي حال. ربما تكون بعض الأقواس مفقودة هناك ، و/أو else بند.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top