有可能这样做吗?假设我想获取列表的最后一个元素,我将创建一个变量i = 0
,并将其递增直到它等于长度。任何的想法?一个例子将不胜感激。
谢谢,
答案 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)
是的,可以在方案中定义局部变量,在函数内使用let
或define
。使用set!
,还可以像您想象的那样重新分配变量。
话虽如此,你可能不应该这样解决你的问题。在Scheme中,通常很好的做法是在不需要时避免set!
(在这种情况下你绝对不需要)。使用索引进一步迭代列表通常是一个坏主意,因为方案的列表是链接列表,因此随机访问O(n)(使last
函数成为您想要实现的O(n^2)
)。 / p>
因此,没有索引的简单递归实现将比您计划的更加惯用且更快,因此更可取。