2013-09-15 3 views
0

Мне нужно сделать рекурсивную процедуру, которая найдет, сколько 6 в числе. Например, 606 имеет два 6. Я начал его.Как вы рассчитываете количество определенной цифры с помощью Схемы?

(define num 
    (lambda (n) 
    (cond 
     ((< n 0) (num (- n))) 
     ((= n 0) 0) 
     ((> n 6) 

Я не хочу ничего конвертировать. Есть ли способ деления его на 10, то, если десятичная цифра равна .6, добавьте один?

ответ

0

1) Для целочисленного деления в схеме, использовать функцию фактор, как в (фактор 9 2) дает 4.
2) для целого модуля в схеме, использовать остаточный функцию , как и в (остальной 9 2) дает 1.

Схема основана на рекурсии, как вы указали. Чтобы решить рекурсивную проблему, вы должны указать решение в терминах меньших экземпляров проблемы: «Число 6 цифр в числе N - это ...» и для ... вы заявляете решение в терминах решения части N.

Самая легкая часть N для повторения - это N/10, которая является почти последней цифрой N. Затем, чтобы решить эту рекурсию, вы должны предположить, что знаете ответ к (num (отношение N 10)). Назовите это значение X. Как знание N и X говорит вам, сколько цифр находится в N?

Если последняя цифра N равна 6, то решение равно X + 1. В противном случае решение равно X. Как вы можете определить, равна ли последняя цифра 6? Используйте оставшуюся функцию.

(define (num N) 
    ; check cases 
    (cond 

    ; case 1) negative condition 
    ((< N 0) (num (- N))) 

    ; case 2) zero condition, the terminal case 
    ((= N 0) 0) 

    ; case 3) recursive case with a 6 as the last digit 
    ((= (remainder N 10) 6) (+ X 1)) 

    ; case 4) recursive case without a 6 as the last digit 
    (#t X) 
)) 

Теперь вы просто должны заменить рекурсивное предположение в течение X, поэтому, например, случай 3 становится

; case 3 
((= (remainder N 10) 6) (+ (num (quotient N 10)) 1)) 

Изменить X для случая 4, а также и вы получите решение.

0

Практически как хорошо, позвольте представить вам modulo. Он принимает два числа и возвращает оставшуюся часть первой, деленную на вторую. Взятие (modulo n 10) вернет последнюю цифру n. Общая схема (ба-Дух-Дух-chiiing) за то, что вы хотите

(define num-6s 
    (lambda (n) 
     (cond 
      ((< n 10) 
       ; Base Case, if n = 6, then 1 else 0 
      ((= (modulo n 10) 6) 
      ; The last digit of n is 6 
      (else 
      ; The last digit of n isn't 6 
      )))) 

Теперь, как другой полезный намек, (floor (/ n 10)) капли последней цифры числа. Вот как вы должны получить следующий номер для рекурсии.

+0

Это фантастика! Спасибо огромное! – IamDaniel

+0

@ user2780598 В любое время, если вы найдете мой ответ полезным, вы можете проверить чек рядом с моим ответом, он помечает вопрос как решенный и снимает его с списка оставшихся без ответа вопросов. – jozefg

Смежные вопросы