2012-02-14 4 views
3

Цель: реализация unfold функция, использующая только два аргумента.функция разворачивания в схеме

Аргументы:

  • первый аргумент F, которая принимает начальное значение некоторого типа I и возвращает NIL или минусы пары двух элементов (первый из этих двух является следующим элементом, который снова входит в список некоторого типа A и следующего начального значения некоторого типа I).
  • Второй аргумент является начальным значением некоторого типа I и возвращение список элементов типа А.

Это то, что я до сих пор, и я не знаю, почему он не работает:

(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 (возрастающий i) (if (= i (- i)) (список) (cons i (+ i 5)))) (развернуть по возрастанию (- 100)) –

+0

В вашем состоянии есть '(= i (- i))', что эквивалентно '(= i 0) ', поэтому он останавливается на 0, а последний, который нужно просить, равен' -5'. –

+0

Думаю, мне просто нужно (= i (105)) тогда. Я просто подумал, что могу определить функцию таким образом, чтобы она печатала все число до включения, включая отрицательный результат. –