我正在尝试建立一个过程来比较两个列表(它们是较大列表的元素)并返回它们的相似程度。该过程将通过求和两个列表中同一索引中元素之间的差异来完成此操作。通过比较两个列表的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)
答案 0 :(得分:4)
您的代码有几个问题。例如:
(if (null? arr1))
表达式是一个if
,没有结果或替代项,因为最右边的)
不得在结果和替代项之后在此处关闭。similarity-arrays
的递归调用不正确,您传递了错误的参数类型,参数数量也不正确。get-list
和similarity-arrays
中,有时您都假设参数是 elements ,而其他时候它们是 lists dust
的定义中还有其他带有不平衡括号的部分。使用良好的IDE并适当缩进代码,以向您显示缺少括号的位置length
,这是一种通过询问是否为null?
来确定是否到达列表末尾的方法。equal?
来测试相等性,而不是eq?
。