Как я могу вернуть символы на основе суммы списков? - PullRequest
0 голосов
/ 27 мая 2019

Итак, я новичок в Схеме и столкнулся с проблемой.Я пытаюсь сделать следующее.Это довольно простая проблема, но я получаю несколько ошибок:

Я пытаюсь суммировать элементы списков (которые состоят только из чисел).Если общая сумма четная, процедура должна вернуть <'divisible_by_2>.Если общая сумма нечетная, она должна вернуть <'not_divisible_by_2>.

Первоначальный шаг заключался в создании процедуры, которая суммирует списки.Этот работает.Вторым шагом было создание функции if, которая принимает сумму списков и возвращает <'divisible_by_2>, если сумма четная, и <'not_divisible_by_2>, если она нечетная.

То, что я написал до сих пор:

(define (divisible_or_not list-sum lst)

(if (odd? list-sum lst)
  (lambda (list-sum lst) 
                        (cond
                          ((null? lst)
                           0)
                          ((pair? (car lst))
                           (+(list-sum (car lst)) (list-sum (cdr lst)))
                          (else
                           (+ (car lst) (list-sum (cdr lst)))
                          )         
                          )
                        )
    ('divisible_by_2)
    ('not_divisible_by_2)
  )
)

)

Версия 2.0 (lst = дерево; количество деревьев = sum-lst):

(define (divisible-or-not tree)
  (define (tree-count tree)
    (cond
      ((null? tree)
        0)
      ((pair? (car tree))
        (+(tree-count (car tree)) (tree-count (cdr tree)))
      (else
        (+ (car tree) (tree-count (cdr tree))))))
  (if (odd? tree-count tree)
    ('divisible-by-2)
    ('not-divisible-by-2))))

1 Ответ

0 голосов
/ 27 мая 2019

Ваш код с правильным отступом выглядит так:

(define (divisible_or_not list-sum lst)
  (if (odd? list-sum lst)
      (lambda (list-sum lst) 
        (cond
         ((null? lst)
          0)
         ((pair? (car lst))
          (+(list-sum (car lst)) (list-sum (cdr lst)))
          (else
           (+ (car lst) (list-sum (cdr lst))))))
        ('divisible_by_2)
        ('not_divisible_by_2))))

Структура вашей программы выглядит следующим образом:

(if ... 
  (lambda (...) ...))

Другими словами, если ваш тест пройден успешно, вы возвращаете анонимную функцию, а если тест не пройден, вы ничего не возвращаете (в Схеме в этом случае значение не определено).

Внутри вашей лямбды код представляет собой список из трех выражений: cond, формы ('divisible_by_2) и формы ('not_divisible_by_2).

Прежде всего, не используйте подчеркивания для разделения слов в Лиспе / Схеме, используйте тире, например так: divisible-by-2.

Во-вторых, из лямбды возвращается только значение последнего выражения, поэтому промежуточное значение cond, поскольку оно не имеет побочных эффектов, в основном работает даром. Вторая форма, ('divisible_by_2), выглядит как вызов функции, но выдает ошибку. Если вы хотите вернуть символ, просто заключите его в кавычки без скобок: 'divisible-by-2.

Поскольку у вас уже есть промежуточная функция, вы можете связать ее с именем:

(define tree-count (sum tree)
  (cond ...))

Я назвал его tree-count, потому что вы также вернетесь в car ваших списков.

Если у вас есть эта функция, вам нужно только применить ее:

(if (even? (tree-count tree))
    'divisible-by-2
    'not-divisible-by-2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...