2012-02-14 43 views
3

目标:实施unfold函数只使用两个参数。在计划中展开功能

的参数:

  • 第一个参数为f这需要一些类型I和返回nil或缺点对的两个元件(第一这两个中的一个初始值是下一个元素进入一些类型A的列表以及某种类型I的下一个初始值)。
  • 第二个参数是某种类型的我的初始值和回报是A型的项目列表

这是我到目前为止,我不知道为什么它不工作:

(define (descending i) 
    (if (= i 0) 
    (list) 
    (cons i (- i 1)))) 

(define nil (list)) 

(define (unfold f init) 
    (if (eq? (f init) '()) 
    (list) 
    (cons init (unfold f (f init))))) 

(unfold (descending 5)) 

应该求

'(5 4 3 2 1) 

这应该是结果,但并非如此。我究竟做错了什么?

回答

5

首先,它应该是(unfold descending 5)。然后f会产生一对,你会使用它的两个组成部分,

(define (unfold f init) 
    (if (eq? (f init) '()) 
    (list) 
    (cons (car (f init)) (unfold f (cdr (f init)))))) 
+0

我明白了!谢谢!另外,如果我想定义返回'(-100 ... 100)的升序函数,我不确定为什么下面的代码停在-5:(define(ascending i) (if(= i( - i)) (= i(0)) (cons i(+ i 5)))) (展开式升序( - 100)) – 2012-02-15 00:21:57

+0

您的情况存在'(= i( - i))',相当于'(= i 0 )',所以它停在0,最后一个是'-5'。 – 2012-02-15 00:28:51

+0

我想我只需要做(=我(105))。我只是认为我可以定义这个函数,使它能够打印所有数字,包括最初的负数。 – 2012-02-15 00:31:59