1

仍然与不考虑强制编程的冲动作斗争,在这里玩耍我有一个程序列表,应该应用于列表中的每个项目,每个项目的结果都应该添加到一个新列表中(我称之为向量在代码中因此 v 和 vec 变量)。最后我得到的只是一个空对象。

(define (inner-loop proc-i item-list i vec)
      (if (< i (length item-list))
        (begin
            (let ((v (cons (proc-i (list-ref item-list i) vec))))
                (inner-loop proc-i item-list (+ i 1) v)))
        (void)))        

(define (outer-loop proc-list item-list i vec)
  (if (< i (length proc-list))
    (let ((v (cons (inner-loop (list-ref proc-list i) item-list 0 vec) vec)))
        (outer-loop proc-list item-list (+ i 1) v))
    (void)))

很明显,这是因为 else 语句,但我不知道如何解决这个问题,主要是因为我认为我处理它的方式从根本上是错误的。

4

1 回答 1

2

对于初学者,请尝试将(void)语句替换为vec. 这是有道理的,因为那是你积累答案的地方。但是不,代码看起来不像惯用的 Scheme - 例如,使用list-ref不是遍历列表时的方式试试这个,这是解决问题的更惯用的方法:

(define (inner-loop proc-list item-i)
  (if (null? proc-list)
      '()
      (cons ((car proc-list) item-i)
            (inner-loop (cdr proc-list) item-i))))

(define (outer-loop proc-list item-list)
  (if (null? item-list)
      '()
      (append (inner-loop proc-list (car item-list))
              (outer-loop proc-list (cdr item-list)))))

您现在可以检查一下:

(outer-loop (list sin sqrt sqr) '(1 2 3))

相当于这个:

(list (sin 1) (sqrt 1) (sqr 1) (sin 2) (sqrt 2) (sqr 2) (sin 3) (sqrt 3) (sqr 3))
于 2013-04-17T21:25:57.207 回答