2

我是计划的新手。今晚是我第一次玩它,除了在课堂上向我解释的幻灯片。我必须编写一个方案程序,该程序接受用户输入运算符,然后对它后面的数字执行该操作。(换句话说,实现我自己的方案版本,内置“+”、“*”等运算符)。问题是我必须使用递归。试图绕过这个方案语法让我很难弄清楚从哪里开始。

因此,我决定从一些至少递归总结用户输入的值的代码开始(不用担心识别用户输入了运算符和括号)。我只是无法弄清楚如何使它工作。这是我正在尝试的:

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

(run (read))

检查 x 是否等于“a”的条件旨在成为我现在打破递归的一种方式。在最终版本中,输入将在一组括号之间,但我想当我谈到它时我会越过那座桥。无论如何,代码只是不断地接受输入,并且永远不会停止。所以,我猜显示 x 的条件永远不会被调用。我知道我可能做错了一切,我真的很感激一些指示。

编辑:好的,我至少开始意识到有些事情没有意义。比如我显示的 x 实际上不会给出总和,因为我没有以任何方式将总和存储在 x 中。但是,我仍然不明白为什么当我输入字母 a 时代码至少没有停止。

编辑 2:我让它工作,但只有当条件等于 1 时。我怎样才能让它识别一个 char 的输入或更好的右括号,让它像它一样结束递归1?:

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

(run (read))
4

2 回答 2

1

End-Of-File (EOF) 标志着输入的结束。Scheme对此有一个程序eof-object?。您的代码基本上是正确的:

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

您使用 结束运行Control-D。如果由于某种原因您无法eof-object?使用特殊字符,例如X. 在这种情况下,您的测试将是(eq? x #\X)

于 2013-04-22T15:17:19.060 回答
0
(define (addition-loop)
 (let ((answer (read)))
      (if (number? answer)
          (+ answer (addition-loop))
          0)))

一旦您输入不是数字的内容,这就会中断。

此外,如您所见,您可以拥有一个零参数的函数。

无论如何,您的代码的问题是当您进入读取时,它的值实际上是相同的 'a 或(引用 a),而不是“a”。

(eqv? 'a "a")

;Value: #f
于 2013-05-10T12:54:10.770 回答