2015-12-01 3 views
2

У меня есть процедура, которая может найти n наименьшие простые числа больше, чем fromКак уменьшить значение на схеме?

(define (primes_range from to n) 
    (for ([i (in-range from to)]) 
     (if (> n 0) 
      (cond ((prime? i) (display i) 
           (- n 1))) 
      false))) 

добавить параметр n к процедуре primes_range и уменьшить его во время выполнения, только если премьер был найден. Но n не изменился. Как это исправить?

+3

'(- п 1)' представляет собой число (в частности, это я - 1), она не изменяет переменную. Я бы рекомендовал вам не пытаться напрямую переводить программы с других языков, но вместо этого изучать Схему. – molbdnilo

+1

Спасибо, в настоящее время я решаю SICP. Это хорошая книга? – Anatoly

+2

Это отличная книга, одна из лучших, но вам нужно забыть, что вы узнали на других языках. – molbdnilo

ответ

3

идиоматические Схема способ написать эту функцию, чтобы использовать рекурсию:

(define (primes-range from to n) 
    (cond ((>= from to) '()) 
     ((<= n 0) '()) 
     ((prime? from) (cons from (primes-range (+ from 1) to (- n 1)))) 
     (else (primes-range (+ from 1) to n)))) 

Вы можете легко заклинанием это на английском языке:

  • случаи Основание:
    1. Наглядный диапазон где from равен или больше to пуст.
    2. Простой диапазон, где n составляет 0 или менее, пуст.
  • рекурсивные случаи:
    1. Если from является простым, то премьер-диапазон from, предваряет результат вызова primes-range начиная с (+ from 1) и (- n 1) элементов.
    2. В противном случае результатом является звонок primes-range, начиная с (+ from 1) (все еще с n элементами).
+0

Большое спасибо! Что означает ''() 'и' cons'? – Anatoly

+0

Я только что прочитал 50 страниц SICP. Итак, как вы можете решить эту проблему без ''() и cons ' – Anatoly

+0

' (define (primes_range от до n) (фильтр prime? (Iota from (- to from) 1)))) ' – WorBlux