Я пытаюсь построить процедуру для сравнения двух списков (которые являются элементами большего списка) и возврата, насколько они похожи. Процедура сделает это путем суммирования разницы между элементами в одном и том же индексе в обоих списках. Это делается рекурсивно путем сравнения car
обоих списков, повторного вызова самого себя с результатом выполнения, являющимся сравнением, и новых списков, являющихся cdr
обоих списков, и, наконец, возвращением результата, когда оба списка пусты. Однако, когда я проверяю это, возвращается следующая ошибка, хотя у меня есть оператор if
для возврата результата, когда списки равны нулю:
Невозможно прочитать свойство 'car' из неопределенного []
Я вполне уверен, что мой синтаксис let
правильный, так как он был исправлен в предыдущем вопросе, и единственный другой раз, когда car
используется в другой используемой процедуре, не имеет ошибок при запуске сам. Что происходит и как это можно исправить?
Код:
(define (get-list name arr)
(if (eq? name (car (car arr)))
(cdr (car arr))
(get-list name (cdr arr))))
(define (similarity-arrays name1 name2 arrs result)
(let ((arr1 (get-list name1 arrs))
(arr2 (get-list name2 arrs)))
(if (= (length arr1)(length arr2))
(let ((x1 (car arr1))
(x2 (car arr2)))
(if (null? arr1))
result
(similarity-arrays
(cdr arr1)
(cdr arr2)
(+ result (- x1 x2)))))
#f))
(define dust
(list (list 'akko 11 3 7 5 4 1 9 8 10 6 2)
(list 'Jodast 10 7 4 6 5 1 11 9 8 3 2)
(similarity-arrays 'Jodast 'Akko dust 0)