【发布时间】:2020-03-09 00:44:23
【问题描述】:
即我得到了这个(所有可能的组合来改变 11):
(list 1 1 1 1 1 1 1 5 5 5 5 1 1 1 10 10 10 1 1 25 25 25 25 25 25)
我的代码应该返回:
((7 . 1) (4 . 5) (3 . 1) (3 . 10) (2 . 1) (6 . 25))
所以它更具可读性。
但是,它正在返回:
((7 . 1) (4 . 5) (1 . 3) (3 . 10) (2 . 1) (6 . 25))
我不知道如何颠倒我所有配对的顺序。
这是我的代码:
(define (rev pair) ;; function reverses a pair, not a list.
(map (lambda (e) (cons (cdr e) (car e))) pair))
(define (rle coins)
(if (null? coins)
'()
(let loop ((firsts (list (car coins)))
(but-firsts (cdr coins)))
(if (or (null? but-firsts)
(not (equal? (car firsts) (car but-firsts))))
(rev (cons (cons (car firsts) (length firsts))
(rle but-firsts)))
(rev (loop (cons (car but-firsts) firsts) (cdr but-firsts)))))))
这是我的测试:
(rle (list 1 1 1 1 1 1 1 5 5 5 5 1 1 1 10 10 10 1 1 25 25 25 25 25 25))
【问题讨论】:
-
我不确定,但
rev函数可能会很好地反转该对,但rle/loop递归恰好在该对上调用rev两次,将其切换回原始状态。或者,它以某种方式调用rev在该对的列表中的偶数次,但在其他对的列表中的奇数次
标签: scheme racket computer-science r5rs