2013-04-22 5 views
2

Я бренд шлепает новую схему. В той мере, в какой сегодня вечером я когда-либо играл с ним в стороне от того, что объяснил мне класс слайдов PowerPoint в классе. Я должен написать программу схемы, которая принимает оператор ввода пользователя, а затем выполняет эту операцию над числами, которые следуют за ней. (другими словами, реализовать мою собственную версию схем, встроенных в операторы «+», «*» и т. д.). Уловка заключается в том, что я должен использовать рекурсию. Пытаясь маневрировать моим синтаксисом схемы, мне очень сложно понять, с чего начать.Я пытаюсь рекурсивно суммировать целые числа, введенные пользователем

Итак, я решил начать с кода, который, по крайней мере, рекурсивно суммирует значения, введенные пользователем (не беспокоясь о признании пользователя, вводящего оператор и круглые скобки). Я просто не могу понять, как заставить его работать. Вот что я хочу:

(define run (lambda (x) 
(cond 
    ((eqv? x "a") (display x)) 
    (else (+ x (run(read)))) 
))) 

(run (read)) 

условие, чтобы проверить, если х равен «а» был задуман как способ для меня, чтобы разорвать рекурсию прямо сейчас. В окончательной версии вход будет находиться между набором скобок, но я думал, что перейду через этот мост, когда приду к нему. В любом случае, код просто продолжает принимать входные данные и никогда не останавливается. Итак, условие отображения x никогда не получится, я думаю. Я знаю, что я, вероятно, все делаю неправильно, и я был бы очень признателен за некоторые указания.

EDIT: Хорошо, я хотя бы начинаю понимать, что что-то не имеет смысла. Например, мое отображение x фактически не даст сумму, так как я не храню сумму в x любым способом. Тем не менее, я до сих пор не понимаю, почему код, по крайней мере, не останавливается, когда я ввожу букву a.

EDIT 2: У меня есть это для работы, но только когда условие равно 1. Как я могу получить его, чтобы распознать ввод символа или лучше, но правильную круглую скобку, чтобы заставить его закончить рекурсию просто как это с 1? :

(define run (lambda (x) 
(cond 
    ((eq? x 1) 0) 
(else (+ x (run(read)))) 
))) 

(run (read)) 

ответ

1

Конец файла (EOF) обозначает конец ввода. Для этого схема имеет процедуру eof-object?. Ваш код в основном правильный:

(define (run x) 
    (if (eof-object? x) 
     0 
     (+ x (run (read))))) 

Вы заканчиваете работу с использованием Control-D. Если по какой-то причине у вас нет доступа к eof-object?, просто используйте специальный символ, например X. В этом случае ваш тест будет (eq? x #\X)

0
(define (addition-loop) 
(let ((answer (read))) 
     (if (number? answer) 
      (+ answer (addition-loop)) 
      0))) 

Это будет перерыв, как только вы вводите что-то, что не является числом.

Кроме того, как вы можете видеть, вы можете иметь функцию нулевых аргументов.

В любом случае проблема с вашим кодом заключается в том, что когда вы вводите a в read, это значение, на самом деле это то же самое: a или (quote a), а не «a».

(eqv? 'a "a") 

;Value: #f 
Смежные вопросы