2015-05-26 4 views
1

Я ищу помощь по вопросам, связанным с схемой.Извлечение чисел по схеме

Я пытаюсь извлечь числа в схеме таким образом, что производит число назад по отношению к п

(экстракт номер пк)

Например, (выписка номер 4321 0) следует производить 1 и (номер экстракта 4321 1) должен производить 2. Кроме того, n может быть любой длины, а k можно считать меньшей длины

ответ

1

Предполагая, что входной номер является неотрицательным значением в базе 10 и что индекс действителен, трюк состоит в том, чтобы «пересечь» число, взяв последовательные отношения, пока мы не найдем t он ожидал индекса или заканчивал цифры. Попробуйте это:

(define (extract-number n k) 
    (cond ((zero? k) (modulo n 10)) 
     ((<= n 0) (error "Invalid input")) 
     (else  (extract-number (quotient n 10) (sub1 k))))) 

Например:

(extract-number 4321 0) 
=> 1 

(extract-number 4321 1) 
=> 2 

(extract-number 10 3) 
=> Invalid input 
1

Это способ сделать это путем изменения числа в строку и сделать подстроку с помощью параметра Pos:

(define (extractNum num pos) 
    (string->number (substring (number->string num) 
     (- (string-length (number->string num)) (+ 1 pos)) 
     (- (string-length (number->string num)) pos)))) 
0
; last-digit : number -> digit 
; return the last digit of n 
; Example: (last-digit 123) is 3 
(define (last-digit n) 
    (remainder n 10)) 

; remove-last-digit : number -> number 
; Example: (remove-last-digit 123) is 12 
(define (remove-last-digit n) 
    (quotient n 10)) 

; digits : number -> list-of-digits 
; return the digits of n 
; Example: (digits 123) is (list 3 2 1) 
(define (digits n) 
    (if (<= 0 n 9) 
     (list n) 
     (cons (last-digit n) 
      (digits (remove-last-digit n))))) 

(define (extract-number n k) 
    (list-ref (digits n) k)) 

Альтернативный способ определения number->digits.:

(define (number->digits n) 
    (reverse (string->list (number->string n)))) 
Смежные вопросы