2016-12-03 4 views
1

Я стараюсь, чтобы мои ноги были мокрыми с использованием схемы рекурсии, однако, неважно, что я пытаюсь, я всегда получаю сообщение об ошибке, когда начинает оценивать первую ветвь оператора if. Ошибка аналогична: «Невозможно вызвать 0. 0 - это не функция». Этот ноль действительно является x в условном, но я не могу понять, почему это происходит. После некоторой отладки времени я пришел к выводу, что это действительно просто проблема рекурсии, которую я не совсем понимаю.Рекурсия схемы с условным

Возможно, кто-то может указать мне в правильном направлении?

(define nums (list 1 5 6 7 8 9)) 

(define (find-len my-list x) ( 
     (if (null? my-list) 
     x 
     (find-len (cdr my-list) (+ 1 x))))) 

(define (len my-list) (find-len my-list 0)) 

(len nums) 

ответ

3

Как было отмечено в комментариях, вы имеете неправильную пару () окружающих выражение if. Попробуйте это:

(define (find-len my-list x) 
    (if (null? my-list) 
     x 
     (find-len (cdr my-list) (+ 1 x)))) 

Помните, что в схеме, пара () означает «применить эту процедуру». Например: (f) применяет процедуру нулевого аргумента под названием f - так что вы должны быть осторожны, когда вы кладете круглые скобки, они не как {} скобки в других языках программирования;)

+0

Спасибо! Я все еще привык к смещению функционального программирования. – corasan

+0

Может быть, развернуть, чтобы показать некоторые идиоматические способы написания процедуры длины списка? +1 – naomik

+0

Более идиоматический, чем использование встроенной процедуры длины? ;) –

Смежные вопросы