在方案中创建二进制计数器

时间:2017-04-27 21:45:31

标签: scheme racket

如何创建一个函数 increment ,这样当你给它一个二进制数时,输出是下一个最高的二进制数?

示例:

• (increment ’(0 0 1))    returns   ’(0 1 0) 
• (increment ’(1 1 0))    returns   ’(1 1 1) 
• (increment ’(1 1 1 1))  returns   ’(0 0 0 0) 
• (increment ’(1 0 1 1 1) returns   ’(1 1 0 0 0) 

我认为最好的方法是检查最低有效数字是否为零,如果是,则将其更改为1。我不确定如何实际编写或使其成为递归程序。 我只是在计划中编程了几个星期,所以任何帮助,甚至伪代码都是有帮助的。

1 个答案:

答案 0 :(得分:0)

以little-endian形式处理是最简单的,所以我建议反转列表,然后将输出反转以将其以big-endian形式恢复。

(define (increment lst)
  (define (go lst carry)
    (if (null? lst)
      null
      (let-values (((digit carry^)
                    (case (+ carry (car lst))
                      ((0) (values 0 0))
                      ((1) (values 1 0))
                      ((2) (values 0 1)))))
        (cons digit (go (cdr lst) carry^)))))
  (reverse (go (reverse lst) 1)))

根据要求,没有多个返回值:

(define (increment lst)
  (define (go lst carry)
    (if (null? lst)
      null
      (let* ((sum    (+ carry (car lst)))
             (digit  (if (= 1 sum) 1 0))
             (carry^ (if (= 2 sum) 1 0)))
        (cons digit (go (cdr lst) carry^)))))
  (reverse (go (reverse lst) 1)))
相关问题