Scheme 如何在方案中的do循环中使用多个语句?
问题Scheme 如何在方案中的do循环中使用多个语句?,scheme,Scheme,问题 计算列表中出现的数字,它们必须相邻。例如:(a a b c a e),返回 ((a2)(b2)(c2)(a1)(e1)) 我试过了 (define (loop lst) (let ((i 1) (j 0)) (do () [(> j (- (length lst) 2))] (if (eq? (car lst) (cadr lst)) (set! i (+ i 1)) (display i) )
计算列表中出现的数字,它们必须相邻。例如:
(a a b c a e)
,返回
((a2)(b2)(c2)(a1)(e1))
我试过了
(define (loop lst)
(let ((i 1) (j 0))
(do ()
[(> j (- (length lst) 2))]
(if (eq? (car lst) (cadr lst))
(set! i (+ i 1))
(display i)
)
(
(set! lst (cdr lst))
(set! j (+ j 1))
)
)
)
)
在运行时,DrScheme抱怨
procedure application: expected procedure, given: #<void>; arguments were: #<void>
程序应用:预期程序,给定:#;论点如下:#
如何在像这样的if
或do
循环中使用多个语句
谢谢,哦,你想计算跑步长度!猜猜看!折叠的另一个问题是:-P
(define (run-lengths lst)
(fold-right (lambda (elem result)
(if (and (pair? result)
(equal? elem (caar result)))
(cons (cons elem (+ (cdar result) 1)) (cdr result))
(cons (cons elem 1) result)))
'() lst))
(我的版本以虚线对的形式返回行程长度,而不是长度2的列表。)因为您使用的是Racket,所以可以使用
foldr
而不是fold right
;这样,您就不需要加载SRFI 1。-1我的眼睛!护目镜没用@克里斯·杰斯特·杨:我不明白?你想做什么?这看起来不像一个理智的阴谋家会或应该写的任何代码。@chrisjester-Young:原谅我!我现在正在努力学习这个计划。我被传统的命令式语言结构迷住了。我觉得使用括号作为代码块非常不舒服。老实说,我差点放弃了!是的,这就是为什么我刚刚给你发了一个基于折叠的答案。一旦掌握了折叠
、映射
等技巧,您就不想再使用命令式循环了。:-)(顺便说一句,我刚刚撤回了我的反对票。谢谢你解释你的任务。)@Chris Jester Young:现在,你伤了我的眼睛。谢谢@陈:哈哈哈。通过阅读foldr
的工作原理,尽最大努力研究我的函数是如何工作的。它会启发你的!:-)@克里斯·杰斯特·杨:嗯,我很熟悉折叠的含义。我从Wiki中读到,类似于<>代码:ST::C++中的累积< /代码>。尽管如此,()
还是非常烦人:(!@Chan:这就像std::acculate
:-)有一天,你会习惯于看括号(或者更确切地说,不看括号)。:-)@Chan:注意代码结构的不同。Lisper不会像C*语言程序员在一行上放花括号一样,在一行上放“悬空”括号。这实际上增加了代码的可读性。有关更多信息,请查看此lisp样式指南: