2

我对计划很陌生。我知道如何从十进制转换为二进制,但我无法提供反过来转换的逻辑。我想从二进制数列表中获取一个十进制数。

十进制示例:

(decimal '(1 0 1)) ---> 5

十六进制示例:

(hexadecimal '(1 0 0 0 1)) ----> 12

到目前为止,我认为可以将列表的最后一个数字乘以 2 i,其中 i 表示列表中的位置,因此最后一个数字乘以 1,下一个数字乘以 2,依此类推。最后在每个递归循环中添加这些数字。不知道如何执行这个想法,也不知道它是否会奏效。

4

4 回答 4

1

规范中的输入不清楚,但是假设 OP 想要转换从左到右读取的二进制数,我们需要先颠倒数字顺序,以便我们乘坐的第一辆车是最低有效位;将每个后续的 2 幂应用于下一个有效位。为了处理函数内部的反转,可以使用命名的 let ,它允许我们在反转列表后仅递归 let 的主体。Guile Scheme 中的一种方法如下所示:

(define (binary->decimal binary-list)
  "Calculate decimal equivalent of list of binary"
  (let loop ((rev-bl (reverse binary-list)))
    (if (null? rev-bl)
        0
        (+ (car rev-bl) (* 2 (loop (cdr rev-bl)))))))
于 2021-12-07T21:00:12.357 回答
0

你对解决方案的书面描述是正确的——你需要做的就是执行它。几个指针:

  • 如果您反转列表,逻辑会容易得多
  • 将每个数字的权重和累积的总和作为递归函数的参数传递,使其更简单

你走在正确的轨道上——继续努力。伪代码尝试可能会让您更清楚。

于 2012-10-05T03:05:51.697 回答
0
(defun bin-list-to-dec (lst)
  (reduce (lambda (x y) (+ (* x 2) y)) lst))
于 2012-12-22T07:12:08.657 回答
0
(define (binary->natural lon)
  (if (null? lon)
      0 
      (+ (car lon) (* 2 (binary->natural (cdr lon))))))
于 2017-09-20T02:07:23.730 回答