回答
有几种方法来声明一个变量;最干净的一个是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))))
非常感谢,非常好的解决方案!顺便说一句,我对上面的if语句有点困惑。 'last tail'属于'if'还是单独声明?我们如何区分? – Chan 2011-04-20 23:13:00
@Chan:'(last tail)'是'if'表达式的其他部分。你可以通过parens和我使用缩进来判断。 – 2011-04-21 08:59:02
是的,它可以定义在方案中的局部变量,或者使用let
或者define
里面的一个函数。使用set!
,也可以像您想象的那样重新分配一个变量。
这就是说,你可能不应该这样解决你的问题。在计划中,当你不需要时避免set!
是一种很好的做法(在这种情况下,你肯定不需要)。进一步遍历使用索引的列表通常是一个坏主意,因为方案的列表是链接列表,因此随机访问O(n)(使last
的功能与您想实现的功能相同)。
因此,一个没有索引的简单递归实现将比你打算做的更具惯用和更快,因此更可取。
谢谢。我的问题是从列表中删除最后一个元素。我可以改变列表,然后删除第一个元素,但是效率太低了。与其他传统语言如C或C++相比,Scheme中的思考是完全奇怪的。 – Chan 2011-04-20 23:05:49
除了使用'set!'之外,还有其他方法可以在Scheme中重新定义一个变量吗? – 2013-06-21 00:42:22
- 1. 如何在Scheme函数内声明一个列表?
- 2. 如何在内联函数中声明一个静态变量?
- 3. 如何在javascript函数内声明一个PHP变量?
- 4. 如何从函数内部声明一个全局变量?
- 5. 如何在Kotlin中声明一个函数作为变量
- 6. Scheme中的严格变量声明
- 7. C++变量声明将被视作一个函数声明
- 8. 定义的函数,在一个声明中声明一个变量
- 9. 如何用GDB在给定的函数范围内声明一个变量?
- 10. 如何声明一个标量变量?
- 11. C++:函数变量声明,它如何在内部工作?
- 12. 如何访问函数内部声明的变量在python
- 13. 如何在OpenCL的内核函数中声明一个函数?
- 14. 使用变量内部的函数声明一个值
- 15. 如何在一个函数内声明一个变量,这个函数使用了多次?
- 16. 如何声明一个函数变量并等待它完成?
- 17. 一个循环内声明的变量
- 18. 如何在AutoHotKey中声明一个热点内的变量?
- 19. 如何声明一个常变量
- 20. 如何声明一个空变量?
- 21. Scheme null?声明
- 22. 无法使用另一个函数内的函数声明的变量
- 23. 声明一个变量与函数返回一个参考
- 24. 如何在另一个函数内重新声明一个函数?
- 25. 如何在一个类中声明公共变量变量
- 26. C++在变量前声明函数
- 27. 在函数中声明变量
- 28. 在函数中声明静态变量
- 29. 在Javascript函数中声明变量
- 30. 在函数之外声明变量
你有什么算法来获取最后一个元素? – 2011-04-20 16:59:50
@larsmans:遍历列表直到“i”等于长度?在计划中这听起来合理吗? – Chan 2011-04-20 23:04:08
这听起来很浪费,因为你遍历列表两次;第一次计算长度。该算法将是线性时间(不像@ sepp2k所假设的那样是二次的),而是两次通过而不是惯用的。 – 2011-04-21 09:00:14