我正在尝试定义一个助手函数,该函数以整数和列表为参数,并生成整数和列表的笛卡尔乘积。
我相信我已经弄清楚了逻辑。但是,当我测试代码并将列表传递给函数时,函数会返回一个空列表。
(define (helper element set)
(cond
((null? set) '())
(cons '(element (car set)) (helper element (cdr set)))
)
)
例如,当我运行(helper 5'(6 8 9((时,它返回一个空列表。
我不知道为什么,但我认为这与传递一个带列表的整数作为参数有关,但我找不到任何东西来证实这一点。
cond
的语法错误。格式为
(cond (test1 then1)
(test2 then2)
...)
最后一个病例不需要检测,这一点没有特殊规定。所以当你写的时候
(cond
((null? set) '())
(cons '(element (car set))
(helper element (cdr set))))
你的测试是符号cons
,然后你的表达式是";评估'(element (car set))
,丢弃结果,然后评估并返回(helper element (cdr set))
";(在cond
的then
部分中的表达式周围存在隐含的begin
(。因此,helper
最终总是递归到一个空集,然后返回它,对它不做任何更改
相反,你想做的是使用总是正确的东西作为你的最后一个测试,然后使用cons
形式作为主体。传统上else
用于此,尽管#t
也很好:
(define (helper element set)
(cond
((null? set) '())
(else (cons '(element (car set))
(helper element (cdr set))))))
然后,您将发现另一个问题,即您打算构建一个包含element
和(car set)
引用的值的列表,而不是引用该列表。报价和列表有什么区别?会帮助你了解那里在做什么。
试试这个:
(define (helper element set)
(map (lambda(x) (cons element x)) set))