схема — рекурсивная функция списков

#scheme

#схема

Вопрос:

У меня есть эта программа:

 (define scale-tree
  (lambda (tree factor)
    (map (lambda (sub-tree)
           (if (list? sub-tree)
               (scale-tree sub-tree factor)
               (* sub-tree factor)))
         tree)))

(scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))
10)
  

Как работает этот код? Сначала мы передаем ему весь список в качестве параметра (list 1 (list 2 (list 3 4) 5) (list 6 7)) , и при первом вызове он (lambda (sub-tree) получает (list 1 (list 2 (list 3 4) 5) (list 6 7)) его в качестве параметра. Для этого мы снова вызываем (scale-tree sub-tree factor) with (list 1 (list 2 (list 3 4) 5) (list 6 7)) . Когда список уменьшается?

Спасибо.

Ответ №1:

Помните, что map делает — она применяет функцию к каждому элементу списка. Итак, при первом вызове эта функция:

 (lambda (sub-tree)
           (if (list? sub-tree)
               (scale-tree sub-tree factor)
               (* sub-tree factor)))
  

применяется к элементам вашего списка: 1 , (list 2 (list 3 4) 5) и (list 6 7) . И так далее в рекурсивных вызовах.