Functional programming 函数式编程和逻辑?

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

我要做一个函数式编程的练习。我用迭代方案求解,我想使用递归,但不知道转换?有人能帮我吗

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