Recursion 返回void的scheme嵌套递归函数
我仍然不想强制编程,在这里我有一个程序列表,应该应用于列表中的每个项目,每个项目的结果应该添加到一个新列表中(我在代码中称为向量,因此称为v和vec变量)。我最后得到的只是一个空的物体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
(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
-这不是做事情的方式!