Представляют пары неотрицательных целых чисел, используя 2^а * 3^б


Даны следующие упражнения:

Упражнение 2.5

Показать, что мы можем пары представляют неотрицательных целые числа, используя только цифры и арифметические операции, если мы представляем пара A и B, как целое число, это продукт 2^а * 3^б. Дать соответствующие определения минусы процедуры, автомобиль и CDR.

Я написал следующее:

(define (cons a b) (* (expt 2 a) 
                      (expt 3 b)))
(define (car x)
  (if (= 0 (remainder x 3)) 
      (car (/ x 3))
      (/ (log x)
         (log 2))))

(define (cdr x)
  (if (= 0 (remainder x 2))
      (cdr (/ x 2))
      (/ (log x)
         (log 3))))

Что вы думаете?



385
2
задан 4 апреля 2011 в 01:04 Источник Поделиться
Комментарии
1 ответ

Ваше определение расстояний является идеальным.

Определения автомобиля и цхд содержать журнал операций, что операции с плавающей запятой. Не только его результаты неточны, он не нужен для решения этой проблемы. Кроме того, обратите внимание, что эти два определения выглядят очень похожими друг на друга. Всякий раз, когда человек видит, повторяется закономерность, следует рассмотреть факторинг его.

Для решения двух вышеупомянутых проблем, можно написать вспомогательную функцию, лог-х, который является специализированным журнал функцию, которая принимает число параметров х и Н и возвращает целое число p такое, что Х ^ р * г = N, где X не делить. Затем, автомобиль и CDR, которые могут вызвать журнала-х, с х , равным 2 и 3 соответственно.

В следующей реализации, я бы переименовал в определениях, чтобы они не конфликтовали с примитивами.

(define (cons-np a b)
(* (expt 2 a) (expt 3 b)))

(define (log-x x n)
(if (= (remainder n x) 0)
(+ 1 (log-x x (/ n x)))
0))

(define (car-np np)
(log-x 2 np))

(define (cdr-np np)
(log-x 3 np))

4
ответ дан 5 апреля 2011 в 08:04 Источник Поделиться