DrRacket和递归语句二进制到十进制

时间:2014-05-08 18:05:07

标签: recursion racket

我正在尝试使用递归转换为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)))))

谢谢!

2 个答案:

答案 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