如何创建一个函数 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。我不确定如何实际编写或使其成为递归程序。 我只是在计划中编程了几个星期,所以任何帮助,甚至伪代码都是有帮助的。
答案 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)))