2015-08-09 1 views
2

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

Не могли бы вы помочь мне в исправлении следующего скрипта Racket для отображения Hello World 10 раз без необходимости изменения или добавления определенных методов, таких как «отображение»?

Благодаря

#lang Racket 
    (define (HelloWorld n) 
    (cond [(= n 0) " "] 
     [(= n 1) "Hello, world !"] 
     [(> n 1) (HelloWorld (- n 1))] 
     ) 
    ) 
+2

Без 'display' или любой другой процедуры печати программа ничего не отображает. REPL на языке '#! Racket' печатает оцениваемые результаты верхнего уровня, но вы не должны зависеть от этого как части программы, только для интерактивного тестирования процедур. – Sylwester

ответ

4

Ваша программа отобразит "Hello World!" только один раз, поскольку в рекурсивном вызове вы ничего не печатаете. Возвращается только окончательный результат вызова, и он состоит из строки «Hello World!».

С другой стороны, единственным способом отображением п раз строкой, без его печати, является получение результата путем конкатенации Строки п раз. Например:

#lang Racket 
    (define (HelloWorld n) 
    (if (<= n 0) 
     "" 
     (string-append "Hello, world ! " (HelloWorld (- n 1))))) 

> (HelloWorld 10) 
"Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! " 

Обратите внимание, как работает рекурсия: конечный случай n <= 0 (это лучше, чем n = 0 избежать infinte рекурсии с отрицательным входом), и в этом случае результат является пустой строкой. В случае n > 0 результат получается конкатенацией после строки с результатом функции, примененной к n-1.

+0

Большое спасибо. Я смог понять это и объяснить это моему маленькому брату. – user3061105

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