scheme嵌套递归函数返回void

时间:2013-04-17 21:21:43

标签: recursion scheme

仍在努力不要强调编程势在必行,在这里玩,我有一个程序列表应该应用于列表中的每个项目,每个项目的结果应该添加到一个新的列表(我指的是作为代码中的向量因此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语句,但我不知道如何解决这个问题主要是因为我认为我的方式基本上是错误的。

1 个答案:

答案 0 :(得分:2)

对于初学者,请尝试将(void)语句替换为vec。这是有道理的,因为那是你积累答案的地方。但不,代码看起来不像惯用方案 - 例如,使用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))