Я сделал факториальную функцию в 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")
С большой помощью я смог получить отрицательное состояние для работы. Любая помощь приветствуется.
ракетка не имеет переполнение стека (см http://docs.racket-lang.org/ . руководство/Lists__Iteration__and_Recursion.html #% 28part ._ Recursion_versus_.Iteration% 29); вы не получите сообщение об ошибке, пока не исчерпаете всю память, доступную для Racket (а затем, скорее всего, выйдет только Racket VM). –
@ RyanCulpepper, так нет способа проверить это? – user6800688