函数式编程和逻辑?

时间:2014-05-18 09:28:28

标签: functional-programming prolog scheme logic

我必须解决函数式编程的练习。我通过迭代方案解决了,我想使用递归但不知道转换?任何人都可以帮我吗?

标题: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)                                 
 )

我想用递归和逻辑编程来解决

1 个答案:

答案 0 :(得分:1)

学习一种全新的语言(即Haskell(SASL dialect)或Scheme(Lisp dialect)如果你知道Java(Algol dialect))比学习同一种语言的新方言更难家庭(如果你了解Scheme,你就会在学习Ruby或者知道Java时学习Ruby)

您似乎已经证明您可以用任何语言撰写Fortran

方案中不存在

while,但由于我也编写了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这样的编程语言。