Схема MIT: ошибка неопределенного возвращаемого значения

Схема MIT: я писал функцию для вычисления n-го члена ряда Фибоначчи (раздел 1.2.2 SICP), но получаю сообщение об ошибке: Неуказанное возвращаемое значение

(define (fib n) (
     define (fib-iter a b count) (
            if (= count n) a
            (fib-iter b (+ a b) (+ count 1)))
     (fib-iter 0 1 1))
)

Спасибо за помощь.


person Apoorve    schedule 27.12.2017    source источник
comment
Сделайте себе одолжение и выбросьте круглые скобки в виде фигурных скобок в привычке C. Лиспы не имеют такой структуры.   -  person molbdnilo    schedule 28.12.2017


Ответы (1)


В вашей вспомогательной функции fib-iter отсутствует закрывающая скобка в конце с дополнительной закрывающей скобкой для fib. В результате строка (fib-iter 0 1 1) включается в fib-iter, а fib в итоге не содержит выражений для фактического вычисления и возврата, отсюда и ошибка ... no expression in body ....

Вот что вы хотите:

(define (fib n)
  (define (fib-iter a b count)
    (if (= count n)
        a
        (fib-iter b (+ a b) (+ count 1))))    ; 1 closing bracket added here
  (fib-iter 0 1 1))                           ; 1 closing bracket removed here

Вам может быть полезно использовать некоторые редакторы, соответствующие скобкам. Например, Dr. Racket выделяет тело функции, содержащееся в наборе скобок, если ваш курсор активен либо при открытии, либо при закрытии указанных скобок.

person assefamaru    schedule 27.12.2017
comment
Большое спасибо! То, что я сделал, было (для меня) концептуальной ошибкой, а не синтаксической. Что я делал: (определение выдумки (параметры имени) (определение выдумки и вызов выдумки)) Но то, что вы сделали, это: (определение выдумки (параметры имени) (определение выдумки) ( призываю выдумщика)) - person Apoorve; 28.12.2017
comment
Действительно, обратите внимание, что fib-iter — это просто вспомогательная функция. Любая правильно написанная вспомогательная функция может быть перемещена из родительской функции, и обе они по-прежнему должны вести себя одинаково (разница только в области видимости). Если бы вы переместили fib-iter из fib в своей исходной версии, вы бы определили fib как: (define (fib n)) без выражений тела для оценки/возврата, отсюда и ваша первоначальная ошибка. Возможно, написание собственных вспомогательных функций поможет вам лучше понять, что делает каждый компонент. - person assefamaru; 28.12.2017