2014-05-18 94 views
0

我必須解決函數式編程中的練習。我通過迭代方案解決,我想使用遞歸但不知道轉換?任何人都可以幫我k嗎?函數式編程和邏輯?

標題:N和N的人,我會做的工作表現j A [i] [j]。找到計劃的工作任務,以便獲得最佳表現?

這裏是代碼使用循環圈

(define (Bai15 N) 
(define i 0) 
(define j 0) 
(define k 0) 
(define t 0) 
(define ii 0) 
(define jj 0) 
(define dem 0) 
(define MaTrix (make-vector N)) 
(define Result (make-vector N)) 
(define Test (make-vector N)) 
(define Max 0) 
(display "a.Nhap ma trận X[1..N][1..N]:") 
(newline) 
(newline) 
(while (< i N) 
    (set! (vector-ref MaTrix i) (make-vector N)) 
    (set! i (+ i 1)) 
) 
(set! i 0) 
(while (< i N) 
     (set! k (vector-ref MaTrix i)) 
     (while (< j N) 
      (display "X[") 
      (display i) 
      (display "][") 
      (display j) 
      (display "]= ") 
      (set! (vector-ref k j) (read)) 
      (set! j (+ j 1)) 
     ) 
     (newline) 
     (set! j 0) 
     (set! i (+ i 1)) 
) 
(newline) 
(set! i 0) 
(set! j 0) 
(while (< i N) 
     (set! k (vector-ref MaTrix i)) 
     (while (< j N) 
       (display (vector-ref k j)) 
       (display " ") 
       (set! j (+ j 1)) 
     ) 
     (newline) 
     (set! j 0) 
     (set! i (+ i 1)) 
) 

    (set! i 0) 
    (while (< i N) 
     (set! (vector-ref Result i) -1) 
     (set! i (+ i 1)) 
) 
    (set! i 0) 
    (while (< i N) 
     (set! (vector-ref Test i) -1) 
     (set! i (+ i 1)) 
) 
    (set! i 0) 
    (while (< i N) 
     (display (vector-ref Test i)) 
     (set! i (+ i 1)) 
) 
    (newline) 
    (set! k 0) 
    (set! i 0) 
    (set! j 0) 
    (set! t 0) 
    (set! dem 0) 

    (while (< t N) 
     (if (and (not (= t 0)) (= i 0)) 
     (set! jj t) 
     (set! jj 0)) 
    (while (>= (vector-ref Test jj) 0) 
      (set! jj (+ jj 1)) 
    ) 
    (display "jj: ") 
    (display jj) 
    (newline) 
    (display "i: ") 
    (display i) 
    (newline) 
    (set! k (+ (vector-ref (vector-ref MaTrix i) jj) k)) 
    (display "k: ") 
    (display k) 
    (newline) 
    (set! (vector-ref Test jj) i) 
    (set! ii 0) 
    (display "Test: ") 
    (while (< ii N) 
      (display (vector-ref Test ii)) 
      (display " ") 
      (set! ii (+ ii 1)) 
    ) 
    (newline) 
    (set! dem (+ dem 1)) 
    (if (= dem N) 
     (begin 
      (if (> k Max) 
      (begin 
       (set! Max k) 
       (display "Max: ") 
       (display Max) 
       (newline) 
       (set! ii 0) 
       (display "Result: ") 
       (while (< ii N) 
         (set! (vector-ref Result ii) (vector-ref Test ii)) 
         (display (vector-ref Result ii)) 
         (display " ") 
         (set! ii (+ ii 1)) 
       ) 
       (newline) 
       (set! i 0) 
       (while (< i N) 
         (set! (vector-ref Test i) -1) 
         (set! i (+ i 1)) 
       ) 
       (set! i 0) 
       (set! dem 0) 
       (set! k 0) 
       (set! t (+ t 1)))) 
      (begin 
      (set! i 0) 
       (while (< i N) 
         (set! (vector-ref Test i) -1) 
         (set! i (+ i 1)) 
       ) 
       (set! i 0) 
       (set! dem 0) 
       (set! k 0) 
       (set! t (+ t 1)))) 
     (begin 
      (set! i (+ i 1)) 
     )) 
) 
    (newline) 
    (display "Divide the work plan: ") 
    (newline) 
    (set! i 0) 
    (while (< i N) 
     (display "Job ") 
     (display (+ i 1)) 
     (display " - People ") 
     (display (+ (vector-ref Result i) 1)) 
     (display " work") 
     (newline) 
     (set! i (+ i 1)) 
) 
    (display "Effective: ") 
    (display Max)         
) 

我想用遞歸和邏輯編程

+0

我認爲在你描述問題時可能會有一些錯誤的翻譯,因爲這句話沒有任何意義:「標題:N和N的人,我會做的工作表現j A [i ] [j]。「也許更長的描述會更清晰地翻譯? – IMSoP

+1

這看起來大多像是另一個程序的逐行翻譯。 「一個堅定的程序員可以用任何語言編寫Fortran」 - Ed Post。 – molbdnilo

回答

1

學習一門全新的語言(即哈斯克爾(SASL dialect)或計劃(Lisp dialect)如果你知道Java的解決(Algol dialect))比學習同一語言家族的新方言更難(例如,如果你知道Scheme,你就會了解Ruby或Common Lisp)

看來你已經證明了它的確,您可以用任何語言編寫Fortran

while在Scheme中不存在,但由於我也編程Algol方言,我知道它應該如何工作。我想它的定義是這樣的:

(define-syntax while 
    (syntax-rules() 
    ((_ expr body ...) 
    (let loop() 
     (cond (expr body ... (loop)) 
      (else 'undefined-return)))))) 

而且你的代碼有很多(set! (vector-ref ...) new-value)不工作。解決此問題後,代碼仍然無法工作。

將項目轉換爲功能並不是微不足道的。從一個問題開始,並使用分而治之分開分割要容易得多。不是所有的代碼都可以正常工作,因爲這意味着你不能有輸出或輸入。相反,您可以嘗試在自己的程序中保留displayread

使用數組是優化的一種手段。按照設計,它們在Scheme中不起作用。一個函數數組會產生一個新數組,並在更改元素時留下舊數組。我知道Racket有這樣的數組,但不是Scheme。如果你迴避列表,反而更好。

您在代碼中使用的模式初始化一個計數器define並在檢查某個限制時將它的全局值增加到while。爲此,您可以使用名爲let例如。在這個使列表成爲列表的代碼中。

(define N 10) 
(define init-list (let zero-loop ((n N) (acc '())) 
        (if (zero? n) 
         acc ; return the accumulated list 
         (zero-loop (- n 1) (cons 0 acc))))) ; ==> undefine, init-list is (0 0 ...) 

(let lol ((n N)) (acc '()) 
    (if (zero? n) 
     acc 
     (lol (- n 1) (cons init-list acc)))) ; ==> ((0 0 0...) ...) 

我不確定你的程序應該這樣做,我會停在這裏。你必須開始在Scheme中寫Scheme。如果你遇到問題,你應該從教程開始。也許按照SICP video講座或者如果你真的想成爲好人,就完成SICP books exercises。在視頻講座中,您將學習如何製作像Prolog這樣的編程語言。