如何在Scheme中的do循环中使用多个语句?

发布于 2024-11-02 16:52:35 字数 652 浏览 1 评论 0原文

问题
计算列表中出现的次数,它们必须是相邻的。例如:(aabbccae),返回 ( (a 2) (b 2) (c 2) (a 1) (e 1) )

我尝试过,

(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>

如何在这样的 ifdo 循环中使用多个语句?

谢谢,

Problem
Count the number occurrence in a list, they must be adjacent. Ex: (a a b b c c a e), returns
( (a 2) (b 2) (c 2) (a 1) (e 1) ).

I tried,

(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))
      )
    )
  )
)

When running, DrScheme complained

procedure application: expected procedure, given: #<void>; arguments were: #<void>

How can I use multiple statements inside an if or a do loop like this?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑白记忆 2024-11-09 16:52:35

哦,你想计算游程长度!你猜怎么着! fold 的另一个问题! :-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。

Oh, you want to compute the run lengths! Guess what! Another problem for fold! :-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))

(My version returns the run lengths as dotted pairs, rather than lists of length 2.) Since you're using Racket, you can use foldr instead of fold-right; that way, you won't need to load SRFI 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文