我必须解决函数式编程的练习。我通过迭代方案解决了,我想使用递归但不知道转换?任何人都可以帮我吗?
标题: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 :(得分: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)
无法正常工作。修好后,代码仍然无法正常工作。
将项目转变为功能性并非易事。从一个问题开始并使用分而治之的方式将其分成几部分就容易得多。并非所有代码都可以正常运行,因为这意味着您无法获得输出或输入。相反,您可以尝试将display
和read
保留在自己的程序中。
使用数组是一种优化方法。根据设计,它们在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这样的编程语言。