我正在尝试构建一个过程来比较两个列表(这是一个更大列表的元素)并返回它们的相似程度。该过程将通过对两个列表中同一索引中的元素之间的差异求和来完成此操作。这是通过比较两个列表的 car
递归完成的,再次调用自身,运行结果是比较,新列表是两个列表的 cdr
,最后当两个列表都为空时返回结果。但是,当我对此进行测试时,即使我有一个 if
语句在列表为空时返回结果,也会返回以下错误:
Cannot read property 'car' of undefined [ ]
我相当确定我的 let
语法是正确的,因为它已在先前的问题中修复,并且唯一一次在其他过程中使用了 car
used 单独运行时没有任何错误。发生了什么,如何解决?
代码:
(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?
.
- 传递一个包含两个列表的列表会使迭代更加困难,您是否考虑过传递两个列表?
我是一名优秀的程序员,十分优秀!