Написание рекурсивной функции перечисления на схеме - PullRequest
2 голосов
/ 27 августа 2011

Я пишу рекурсивную функцию перечисления, и у меня где-то есть простая ошибка.

Вот что должно произойти :

(enum 1 0.5 2.5)  
> (1.0 1.5 2.0 2.5)

Вот код:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          ('(stop))
          )))

Edit:
Я получаю ошибку (из экспромта (http://impromptu.moso.com.au/)):

)
> (print (enum 0 0.5 2.5))  
:ERROR: position:(0) in function "enum"  
illegal function  
Trace: enum  

1 Ответ

5 голосов
/ 27 августа 2011

Я считаю, что ваша проблема в строке

('(stop))

Я думаю, у вас есть правильная идея, что вы хотите прекратить выполнение рекурсии, как только дойдете до конца, но это неспособ сделать это.Поскольку вы поместили это в двойные круглые скобки, это интерпретируется как «оценить« стоп », а затем попытаться вызвать его как функцию».Однако stop не является функцией, поэтому возникает ошибка.

Чтобы исправить это, если вы хотите сделать возвращаемое значение списком, содержащим только stop, используйте функцию list:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          (list stop)
          )))

Обратите внимание, что здесь есть только один набор скобок вокруг list stop.

Надеюсь, это поможет!

...