shayster01
shayster01

Reputation: 214

DrRacket and Recursive Statement Binary to Decimal

I am trying to convert a binary number entered as "1010" for 10 using recursion. I can't seem to wrap my head around the syntax for getting this to work.

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

Thanks!

Upvotes: 1

Views: 6993

Answers (2)

Sylwester
Sylwester

Reputation: 48745

If you want "1010" to translate to 10 (or #b1010, #o12 or #xa) you implement 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

It processes the highest number first and everytime a new digit is processed it multiplies the accumulated value with radix and add the new "ones" until there are not more chars. If you enter "1010" and 2 the accumulated value from beginning to end is 0, 0*2+1, 1*2+0, 2*2+1, 5*2+0 which eventually would make sure the digits numbered from right to left 0..n becomes Sum(vn*radic^n)

Now, if you need a procedure that only does base 2, then make a wrapper:

(define (binstr->number n)
  (string->number n 2))

(eqv? (binstr->number "1010") #b1010) ; ==> #t

Upvotes: 0

uselpa
uselpa

Reputation: 18917

Here's a simple recursive solution:

(define (bin->dec n)
  (if (zero? n)
      n
      (+ (modulo n 10) (* 2 (bin->dec (quotient n 10))))))

testing:

> (bin->dec 1010)
10
> (bin->dec 101)
5
> (bin->dec 10000)
16

Upvotes: 3

Related Questions