【问题标题】:Creating a binary counter in scheme在方案中创建二进制计数器
【发布时间】:2017-04-27 21:45:31
【问题描述】:

如何创建一个函数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 0 0) 吗?此外,您的引号使用了不正确的字符,它是 ',而不是

标签: scheme racket


【解决方案1】:

小端形式最容易处理,所以我建议反转列表,然后反转输出以将其放回大端形式。

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

【讨论】:

  • 效果很好!出于好奇,您能想出一种不使用 carrylet-values 函数的方法吗?我更习惯使用基本的 cons car 和 cdr。
  • @Lazarus 当然。见上文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多