Recursion 返回void的scheme嵌套递归函数

Recursion 返回void的scheme嵌套递归函数,recursion,scheme,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) ve

我仍然不想强制编程,在这里我有一个程序列表,应该应用于列表中的每个项目,每个项目的结果应该添加到一个新列表中(我在代码中称为向量,因此称为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)))
(定义(内部循环过程i项目列表i vec)
(如果(

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

首先,尝试用
vec
替换
(void)
语句。这是有道理的,因为这是你积累答案的地方。但是不,代码看起来不像惯用的模式——例如,当遍历列表时,使用
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))

你是对的,用v替换(void)修复了它。我很想看到更好的方法。谢谢你,实际上这样做确实解决了空虚问题,但是的,这在逻辑上是不正确的,因为它似乎在重复步骤,这不应该帮助我理解更多,但我正试图做更多类似的事情。。。过程列表:
(sin sqrt sqr)
项目列表:
(1 2 3)
结果:
((sin 1)(sqrt 1)(sqr 1)(sin 2)(sqrt 2)(sqr 2)(sin 3)(sqrt 3)(sqr 3))
。我还能用地图吗?嗯……没错。因为函数的输出是数字列表,而不是列表列表。Cons用于向列表中添加元素,append用于将列表连接在一起。不客气!记住:我们使用
null?
检查列表是否为空,
car
访问当前元素,
cdr
前进到下一个元素-而不是索引,
list ref
-这不是做事情的方式!