Vector (方案)无cons的递归?
本程序应根据给定程序替换vec1中的值。因此,如果过程是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中的每个值。例如:
~ (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)