Functional programming 函数式编程和逻辑?
我要做一个函数式编程的练习。我用迭代方案求解,我想使用递归,但不知道转换?有人能帮我吗 标题:N和N的人,我会做的事情工作表现j A[i][j]。找到工作分配的计划,以便取得最佳绩效 下面是代码使用循环圈Functional programming 函数式编程和逻辑?,functional-programming,prolog,scheme,logic,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)) (d
(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)
)
(定义(Bai15 N)
(定义i0)
(定义j 0)
(定义k0)
(定义t0)
(定义ii 0)
(定义JJ0)
(定义dem 0)
(定义矩阵(生成向量N))
(定义结果(生成向量N))
(定义测试(生成向量N))
(定义最大值0)
(显示“a.Nhap ma trậnx[1..n][1..n]:”)
(新行)
(新行)
(while(=(向量参考测试jj)0)
(集合!jj(+jj1))
)
(显示“jj:”)
(显示jj)
(新行)
(显示“i:”)
(显示一)
(新行)
(集合!k(+(向量参考(向量参考矩阵i)jj)k))
(显示“k:”)
(显示k)
(新行)
(设置!(矢量参考测试jj)i)
(集!ii 0)
(显示“测试:”)
(而(k最大值)
(开始
(设定!最大k)
(显示“最大:”)
(显示最大值)
(新行)
(集!ii 0)
(显示“结果:”)
(而(
我想用递归和逻辑编程来解决这个问题学习一门全新的语言(如Haskell()或Scheme(),如果你懂Java()),要比学习同一语系的新方言(如Ruby,如果你懂Java或Common Lisp,如果你懂Scheme)更难 看来你已经证明了你能用任何语言写作是真的
虽然
在Scheme中不存在,但由于我也编写了Algol方言的程序,所以我知道它应该如何工作。我猜它的定义是这样的:
(定义语法时
(语法规则()
((expr body…)
(让循环()
(条件(出口主体…(回路))
(else'未定义返回(()()())))
另外,您的代码中有大量的(set!(vector ref…)新值)
,这些值不起作用。修复此问题后,代码仍然不起作用
将一个项目转化为功能性项目并不是一件小事。从一个问题开始,用“分而治之”的方法把它分成几个部分要容易得多。并不是所有的代码都能正常工作,因为这意味着既不能有输出也不能有输入。相反,您可以尝试在它自己的过程中保持显示
和读取
使用数组是一种优化方法。根据设计,它们在方案中不起作用。函数数组将生成一个新数组,并在更改元素时保留旧数组。我知道Racket有这样的数组,但不是Scheme。如果你重复使用列表会更好
您在代码中的模式使用define
初始化计数器,并在检查特定限制时在中增加其全局值。为此,您可以使用命名的let
例如,在该代码中,可以创建列表列表
(定义N 10)
(定义初始列表(让零循环((n)(acc’())
(如果(零?n)
acc;返回累计列表
(零环路(-n1)(cons 0 accЮЮ);=>unde