如何在Scheme函数中声明变量?

时间:2011-04-20 16:45:53

标签: scheme

有可能这样做吗?假设我想获取列表的最后一个元素,我将创建一个变量i = 0,并将其递增直到它等于长度。任何的想法?一个例子将不胜感激。

谢谢,

2 个答案:

答案 0 :(得分:12)

声明变量有几种方法;最干净的是let

(let ((x some-expr))
  ; code block that uses x

但是你不需要这个来获取列表的最后一个元素。只需使用递归:

(define (last xs)
  (if (null? (cdr xs))
    (car xs)
    (last (cdr xs))))

注意:如果需要,可以使用变量来缓存cdr的结果:

(define (last xs)
  (let ((tail (cdr xs)))
    (if (null? tail)
      (car xs)
      (last tail))))

答案 1 :(得分:3)

是的,可以在方案中定义局部变量,在函数内使用letdefine。使用set!,还可以像您想象的那样重新分配变量。

话虽如此,你可能不应该这样解决你的问题。在Scheme中,通常很好的做法是在不需要时避免set!(在这种情况下你绝对不需要)。使用索引进一步迭代列表通常是一个坏主意,因为方案的列表是链接列表,因此随机访问O(n)(使last函数成为您想要实现的O(n^2))。 / p>

因此,没有索引的简单递归实现将比您计划的更加惯用且更快,因此更可取。