2015-10-13 7 views
0

Я новичок в Scheme, и мне интересно, как привести в порядок возвращаемые значения из рекурсивной функции, которую я написал как назначение. Функция просто выводит BST в порядке наименьшего значения. Мой вопрос немного педантичен, но мне любопытно. Вывод функции представляет собой список чисел, но рекурсивная реализация приводит к тому, что пустой список возвращается в самом конце. т. е. 8 16 20 '(). Есть простой способ просто вернуть список чисел и оставить пустой список? Я могу представить пару способов сделать это; создавая новый список или строку и возвращая это в конце, но это добавит справедливую часть накладных расходов для такой простой задачи. Есть ли более простой способ достичь этого результата? Благодарю.Типы возврата в Racket Scheme

Примечание: назначение завершено, и на этом этапе у меня должны быть полные отметки, поэтому это не вопрос домашней работы.

#lang racket 

(define (show lst) 

    (cond 
    [(null? (cadr lst)) 
    '()] 

    ; recur smaller tree 
    [(< (car lst) (caaddr lst)) 
    (show (cadr lst)) 
    ]) 

    ; print cur node 
    (writeln (car lst)) 

    (cond 
    [(null? (cadr lst)) 
    '()] 

    ; recur larger tree 
    [(show (caddr lst))]) 

) 

(show '(16 (8 (2()()) (10()())) (20 (18()()) (30()())))) 
+0

Ваш второй 'cond' странный, он должен иметь предложение' else'. Работает случайно. – uselpa

ответ

1

Вы могли бы заменить '() на (void) в вашем коде, так как REPL не напечатает это значение. Или просто избегайте давать возвращаемые значения в целом:

(define (show lst) 
    (unless (null? (cadr lst)) 
    (when (< (car lst) (caaddr lst)) 
     (show (cadr lst)))) 
    (writeln (car lst)) 
    (unless (null? (cadr lst)) 
    (show (caddr lst)))) 
+0

(void) - идеальный. Я думал, что это простой способ сделать это, но не смог найти его. Я не встречал «пока» до сих пор, но, читая документацию, она кажется сокращенной, иначе верните пустоту, поэтому я думаю, что это просто более чистая версия той же идеи. Спасибо за помощь! –

+0

Если вы ничего не возвращаете, вы фактически возвращаете '# ' неявно. Поэтому, вероятно, проще не возвращать ничего, как в моем примере, но возврат void явно работает так же хорошо. – uselpa

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