2012-10-13 38 views
2

我想了解如何在函数中传递函数作为参数,但我在理解教程方面遇到了很多麻烦。 这里就是我想要做的事:方案中的简单高阶函数

(define (addone n) 
(+ n 1)) 
(define (for-n start stop fn) 
(if (< start stop) 
    (list) 
    (cons (fn start) (for-n (+ start 1) stop fn)))) 

基本上我只是想返回FN的值启动功能,启动+ 1,...起动+停机在列表中。

因此(for-n 1 5(addone 0))的预期输出将是(1 2 3 4 5)。 我想我在这里真的错过了一些非常基本的概念,因为我似乎甚至没有正确地调用解释器中的函数,而且我也没有掌握如何告诉方案将fn解释为函数而不是仅仅定期参数。

我想通了(虽然通过纯粹的试验和错误),我不知道我做了什么,但至少它的工作原理!

(define (function x) 
    x) 
(define (for-n start stop fn) 
    (if (> start stop) 
    (list) 
    (cons (fn start) (for-n (+ start 1) stop fn))))) 
+0

你有只是问问题的问题并让他们不加讨论......受访者把他们的宝贵时间放在回答你的问题上,让他们像这样,毫不动摇或不被接受......这是否合理? – 0decimal0

回答

1

函数调用(addone 0)等于值1。如果你想通过功能addone本身(而不是1),不要把它包装在圆括号中。 (for-n 1 5 addone)addone函数传递给for-n。如果您将圆括号括起来,Scheme将调用addone并传递结果。

1

一些反馈,让你知道什么是错了你的第一个版本:

  • 基本情况的递归是建立一个列表平时一般返回'(),而不是(list)
  • 正如你已经发现,基本情况的条件是错误的:递归结束时(> start stop)而不是当(< start stop)最初陈述
  • 没有必要定义addone过程,至少在一些Scheme解释器已经存在还有一个叫add1
  • 最后,调用接收其它过程的过程时,只需沿着功能通过程序,无须先申请它 - 它返回一个值不是一个函数如预期。我的意思是说这是错误的:(for-n 1 5 (addone 0))这是正确的:(for-n 1 5 addone)。当你写(addone 0)函数被应用并返回值1,你打算通过的是addone,程序本身。

有了上述所有的建议,这是一个正确的做法应该是什么样子:

(define (for-n start stop fn) 
    (if (> start stop) 
     '() 
     (cons (fn start) (for-n (add1 start) stop fn)))) 

这样称呼它:

(for-n 1 5 add1) 
> '(2 3 4 5 6)