Как вернуть значение, если рекурсивные вызовы не возвращают значение в схеме - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующий код, чтобы определить, является ли число простым числом:

(define (recIsPrime num n)
    (display num)(display (- n 1))(newline)
    (cond ((= (remainder num (- n 1)) 0) #f)
        (else (if (> n 3)
            (recIsPrime num (- n 1)))))
    #t
    )

Номера будут одинаковыми при первом вызове. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз возвращается #t вместо #f, который должен быть возвращен, если найдено число от 2 до n, которое делится на.

Как я могу вернуть #f, если найден такой номер, и обойти #t, который я пытаюсь вернуть, если такой номер не найден?

1 Ответ

0 голосов
/ 26 октября 2018

Балансируйте ваши скобки.#t находится за пределами cond;это последнее выражение в recIsPrime, поэтому оно всегда возвращается в качестве значения.

Просто поместите его в ветку cond, вот так:

(define (recIsPrime num n)
    (cond 
      ( (= (remainder num (- n 1)) 
           0)
          #f )
      (else 
          (if (> n 3)
            (recIsPrime num (- n 1))
            #t
            ))))

Наличие if внутри вашего cond является избыточным;лучше вместо этого объединить их в один cond с тремя альтернативами:

(define (recIsPrime num n)
    (cond 
      ( (= (remainder num (- n 1)) 
           0)
          #f )
      ((> n 3)
          (recIsPrime num (- n 1)))
      (else
          #t )))

Или использовать логические связки, как

(define (recIsPrime num n)
    (and (not (= (remainder num (- n 1)) 
                 0))
          (or (<= n 3)
              (recIsPrime num (- n 1)))))

Похоже, вы намереваетесь назвать его как (recIsPrime num num) ипусть он опробует числа в порядке убывания.Не.Число гораздо чаще имеет меньший делитель, чем больший.

Кроме того, 2 является простым.

...