我是Scheme的新手 - 我目前正在尝试学习语法以及如何递归思考。我来到一个关于向量的部分,并希望能够通过某种循环(当然使用递归)在我的向量中设置值。我有这个变量:
(define my-vector (make-vector 5))
然后我想使用vector-set!
过程填充。通常在C ++(我真正熟悉的唯一其他语言)中,这将以迭代的方式完成,例如
//...
std::vector<int> myVector;
for(int i = 0; i < 5; ++i) // populate the vector
myVector.push_back(i);
std::vector<int>::const_iterator outIter;
for(outIter = myVector.begin();
outIter != myVector.end(); ++outIter)
std::cout << *outIter << " ";
std::cout << std::endl;
//...
但是,我知道这种事情应该通过Scheme中的递归来完成。递归populate-vector
过程可能会是什么样的?
答案 0 :(得分:3)
(let f ((i 0))
(when (< i 5)
(vector-set! my-vector i i)
(f (+ i 1))))
您可以在线试用here。
您也可以尝试使用DO
语法,但大多数人发现很难记住:)
学习使用名为LET
非常重要。
另请注意,Scheme向量只是一个固定大小的数组。
答案 1 :(得分:0)
一种选择是这样的:
void PopulateVector(vector<int>& vec, int n) {
if (n < 0) return;
PopulateVector(vec, n - 1);
vec.push_back(n);
}
这个想法如下。首先,如果您尝试创建一个值为0到某个负数的向量,我们什么都不做;没有要添加的值。否则,我们首先使用值0到n - 1填充向量,然后将n附加到向量。
请注意,就内存使用而言,这是一个非常低效的过程;它需要调用堆栈的线性内存。迭代版本可能会更加优越。我们可以将此函数重写为尾递归,并希望优化器消除递归,但不能保证会发生这种情况(同时,IIRC,Scheme需要消除尾部调用)。我们的想法是使用包装函数,这样我们就可以计算n而不是n:
void PopulateVector(vector<int>& vec, int n) {
if (n < 0) return;
PopulateVectorRec(vec, 0, n);
}
void PopulateVectorRec(vector<int>& vec, int current, int n) {
if (current > n) return;
vec.push_back(current);
PopulateVectorRec(vec, current + 1, n);
}
希望这有帮助!