我正在尝试使用递归转换为10输入为“1010”的二进制数。我似乎无法绕过使其工作的语法。
(define (mod N M)
(modulo N M))
(define (binaryToDecimal b)
(let ([s 0])
(helper b s)))
(define (helper b s)
(if (= b 0)
(begin (+ s 0))
(begin (* + (mod b 2) (expt 2 s) helper((/ b 10) + s 1)))))
谢谢!
答案 0 :(得分:3)
这是一个简单的递归解决方案:
(define (bin->dec n)
(if (zero? n)
n
(+ (modulo n 10) (* 2 (bin->dec (quotient n 10))))))
测试:
> (bin->dec 1010)
10
> (bin->dec 101)
5
> (bin->dec 10000)
16
答案 1 :(得分:0)
如果您希望"1010"
翻译为10
(或#b1010
,#o12
或#xa
),请执行string->number
(define (string->number str radix)
(let loop ((acc 0) (n (string->list str)))
(if (null? n)
acc
(loop (+ (* acc radix)
(let ((a (car n)))
(- (char->integer a)
(cond ((char<=? a #\9) 48) ; [#\0-#\9] => [0-9]
((char<? a #\a) 55) ; [#\A-#\Z] => [10-36]
(else 87))))) ; [#\a-#\z] => [10-36]
(cdr n)))))
(eqv? #xAAF (string->number "aAf" 16)) ; ==> #t
它首先处理最高数字,每次处理新数字时,它将累加值乘以基数并添加新数字&#34;&#34;直到没有更多的字符。如果您输入"1010"
和2,则从头到尾的累计值为0, 0*2+1, 1*2+0, 2*2+1, 5*2+0
,最终会确保从右到左编号的数字为0..n变为Sum(vn*radic^n)
现在,如果您需要一个只执行base 2的过程,那么请创建一个包装器:
(define (binstr->number n)
(string->number n 2))
(eqv? (binstr->number "1010") #b1010) ; ==> #t