Перепишите код с меньшим количеством процедур на схеме

Я написал программу, которая, учитывая два числа, которые задают диапазон, должна возвращать число (количество) чисел в этом диапазоне, представленное в octal форме, из числа одинаковых цифр. Например, 72->111 соответствует этим критериям, потому что все цифры одинаковы. Примеры вывода:

(hw11 1 8) → 7, (hw11 1 9) → 8, (hw11 1 18) → 9, (hw11 1 65) → 14 и так далее...

Моя проблема заключается в том, что, чтобы быть правильно, моя программа должна определять только 2 процедуры, и на данный момент у меня есть намного больше, чем это, и я понятия не имею, как сделать их меньше. Поэтому любая помощь с переписыванием кода приветствуется :). Код ниже:

(define (count-digits n)
 (if (<= n 0) 
 0 
 (+ 1 (count-digits (quotient n 10)))))

(define (toOct n)
 (define (helper n octNumber i)
 (if(<= n 0)
 octNumber
 (helper (quotient n 8) 
 (+ octNumber 
 (* (expt 10 i) 
 (remainder n 8)))
 (+ i 1))))
 (helper n 0 0))

(define (samedigits n)
 (define (helper n i)
 (if (<= n 0)
 #t 
 (if (not (remainder n 10) i))
 #f
 (helper (quotient n 10) i))))

(helper n (remainder n 10))
)

(define (hw11 a b)
 (define (helper a x count)
 (if (> a x)
 count
 (if (samedigits (toOct x))
 (helper a (- x 1) (+ count 1))
 (helper a (- x 1) count))))
 (helper a b 0))
1 ответ

Вероятно, у вас есть ограничения, и вы не указали, какую реализацию схемы вы используете; ниже приведен пример, который был протестирован на Racket and Guile:

(define (hw11 a b)
 (define (iter i count)
 (if (<= i b)
 (let* ((octal (string->list (number->string i 8))) 
 (allc1 (make-list (length octal) (car octal))))
 (iter (+ i 1) (if (equal? octal allc1) (+ count 1) count)))
 count))
 (iter a 0))

Тестирование:

> (hw11 1 8)
7
> (hw11 1 9)
8
> (hw11 1 18)
9
> (hw11 1 65)
14

licensed under cc by-sa 3.0 with attribution.