2016-09-27 8 views
1

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

#lang racket 

(provide recursive_factorial) 
(provide tail_factorial) 


(define (recursive_factorial number) 
(cond [(= 0 number) 1] 
     [(negative? number) (raise-argument-error 'recursive_factorial "negative?" number)] 
     [(* number (recursive_factorial (- number 1)))])) 


(define (tail_factorial number accumulator) 

(cond[(= number 0) accumulator] 
     [(negative? number) accumulator (raise-argument-error 'tail_factorial "negative?" number accumulator)] 
     [(tail_factorial (- number 1) (* accumulator number))] 
    )) 

И вот моя попытка проверить его.

(check-not-exn (λ() (recursive_factorial(100000000)))"stack overflow") 
(check-not-exn (λ() (tail_factorial(100000000)))"stack overflow") 

С большой помощью я смог получить отрицательное состояние для работы. Любая помощь приветствуется.

+0

ракетка не имеет переполнение стека (см http://docs.racket-lang.org/ . руководство/Lists__Iteration__and_Recursion.html #% 28part ._ Recursion_versus_.Iteration% 29); вы не получите сообщение об ошибке, пока не исчерпаете всю память, доступную для Racket (а затем, скорее всего, выйдет только Racket VM). –

+0

@ RyanCulpepper, так нет способа проверить это? – user6800688

ответ

1

Ваша функция возвращает -1, когда number отрицательный. Так не должно быть испытание:

(check-equal? (recursive_factorial -4) -1) 

UPDATE

Как насчет:

#lang racket 
(provide recursive_factorial) 
(define (recursive_factorial number) 
    (cond [(= 0 number)  1] 
     [(negative? number) (error 'recursive_factorial 
            "Cannot pass a negative number")] 
     [else    (* number (recursive_factorial (- number 1)))])) 
+0

На самом деле мне это нужно как-то не вернуть-1. Вместо этого скажите мне, что вызов недействителен. – user6800688

+0

@ user6800688 Добавлено новое предложение. – soegaard

+0

Это отлично работает! Я действительно смог понять это, подняв исключение, а затем используя (check-exn), чтобы заставить его работать – user6800688