我试图以递归方式对用户输入的整数求和

时间:2013-04-22 05:04:46

标签: recursion scheme

我是品牌打屁股的新计划。在某种程度上,今晚是我第一次玩它,除了幻灯片幻灯片在课堂上向我解释的内容。我必须编写一个带有用户输入操作符的方案程序,然后对其后面的数字执行该操作。 (换句话说,实现我自己的方案版本内置'+','*'等操作符)。问题是我必须使用递归。试图围绕这个方案语法进行操作让我很难弄清楚从哪里开始。

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

(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))

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

一旦输入非数字的内容,这将会中断。

此外,您可以看到,您可以使用零参数函数。

无论如何,代码的问题在于你输入一个读取,它的值实际上是一个'a或(引用a),而不是“a”。

(eqv? 'a "a")

;Value: #f