我正在尝试构建一个过程来比较两个列表(它们是较大列表的元素)并返回它们的相似程度。 该过程将通过对两个列表中同一索引中的元素之间的差异求和来执行此操作。 这是通过比较两个列表的car
递归完成的,再次调用自身,运行结果是比较,新列表是两个列表的cdr
,最后在两个列表都为空时返回结果。 但是,当我对此进行测试时,即使我有一个if
语句在列表为 null 时返回结果,也会返回以下错误:
无法读取未定义的属性"汽车"[ ]
我相当确定我的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)
您的代码存在几个问题。例如:
(if (null? arr1))
表达式是一个没有结果或替代的if
,因为最右边的)
不能在那里关闭,只能在结果和替代之后。- 对
similarity-arrays
的递归调用不正确,您传递了错误的参数类型,并且参数的数量也不正确。 - 与前一个相关:无论是
get-list
还是similarity-arrays
有时您都假设参数是元素,有时它们是列表 - 还有其他部分带有不平衡括号,例如,在
dust
的定义中。使用一个好的 IDE 并正确缩进代码以显示缺少括号的位置 - 我们应该尽量避免使用
length
,如果通过询问它是null?
来找出我们是否已经到达列表末尾的方法。 - 对于此问题,您应该使用
equal?
来测试相等性,而不是eq?
。
传递包含两个列表 - 的列表会使迭代更加困难,您是否考虑过传递两个列表?