Vector (方案)无cons的递归?

Vector (方案)无cons的递归?,vector,scheme,Vector,Scheme,本程序应根据给定程序替换vec1中的值。因此,如果过程是+,那么它将用每个元素的总和替换vec1中的每个值。例如: ~ (define v (vector 1 2 3 4 5 6)) ~ (vector-join v + v) ~ v #(2 4 6 8 10 12) 我知道递归有问题,但我不知道如何解决它。我只学会了如何使用cons进行递归,我认为在这类问题中这样做是不对的 以下是我目前的代码: (define v (vector 1 2 3 4 5 6)) (define (vector

本程序应根据给定程序替换vec1中的值。因此,如果过程是
+
,那么它将用每个元素的总和替换vec1中的每个值。例如:

~ (define v (vector 1 2 3 4 5 6))
~ (vector-join v + v)
~ v
#(2 4 6 8 10 12)
我知道递归有问题,但我不知道如何解决它。我只学会了如何使用cons进行递归,我认为在这类问题中这样做是不对的

以下是我目前的代码:

(define v (vector 1 2 3 4 5 6))

(define (vector-join vec1 pre vec2)
  (define (help v1 proc v2 i)
    (if (null? v1) v1
        (if (null? v2) v1
            (if (>= i (vector-length v1)) v1 
                (cons (vector-set! v1 i (proc (vector-ref v1 i) (vector-ref v2 i)))
                      (help v1 proc v2 (add1 i)))))))  
  (help vec1 pre vec2 0))
当我输入这个时:

(vector-join v + v)
它返回以下内容:

(#<void> #<void> #<void> #<void> #<void> #<void> . #(2 4 6 8 10 12))
(2 4 6 8 10 12))

最后一部分是正确的答案,但我不知道为什么会出现
#voids
。有什么帮助吗?

请注意,
cons
null?
与此答案无关,这里我们不讨论列表。另外,您正在修改一个作为参数接收的向量,这不是最好的主意,但让我们暂时忽略这个事实。像往常一样,我将为您提供解决方案的总体结构,以便您可以计算出详细信息:

(define (vector-join vec1 pre vec2)
  (define (help v1 proc v2 i)
    (cond (<???> v1)            ; what's the exit condition?
          (else
           <???>                ; set the current value at position `i`
           <???>)))             ; advance the recursion, no consing here!
  (help vec1 pre vec2 0))
此过程以命令式语言提醒解决方案的方式编写。不寻常的部分(即,对于Scheme程序)是,在第二个
中,您正在对数据结构(本例中为向量)进行变异,但这样做只是为了效果,而不是为了值
向量集
操作不会返回有用的值,这解释了问题代码中显示的所有
#

(define v (vector 1 2 3 4 5 6))
(vector-join v + v)
=> '#(2 4 6 8 10 12)