我知道通过这样做可以编写一个简单的阶乘函数:
(define fact
(lambda (n)
(if (= n 0) 1
(* n (fact (- n 1)))))但是,只有当您发送一个数字时,这才会起作用;如果您发送列表或符号,则会出现错误。所以我想做的是让它适用于所有的东西,如果是一个列表,做列表中每个单独元素的阶乘。以下是我所拥有的:
(define listFact
(lambda (n)
(cond
((null? n) 1)
((symbol? n) n)
((number? n) (if (= n 0) 1 (* n (listFact (- n 1)))))
((cons? n) (cons (listFact(car n)) (listFact(cdr n)))))))我不太擅长计划,但我需要能够了解基本知识。除了一个列表之外,每个输入都正常工作。
> (listFact '())1
(listFact 'a)
'a
(listFact 4)
24
(listFact‘(12,3))
缺点:第二个参数必须是一个列表,但是收到了6和1。
我想做的最后一件事是返回:
(名单1 2 6)
我不知道为什么不行。如果有人可以帮助我在不改变整个代码结构(即不要使用apply/map或多个函数)的情况下解决这个问题,我们将不胜感激。我想唯一搞砸的是那个有缺点的人。
谢谢。
发布于 2013-11-17 20:17:08
只需替换
(cond
((null? n) 1)使用
(cond
((null? n) n)为了使cons正常工作,由于尾随的nil:list (1 2 3)实际上是(1 . (2 . (3 . ()))),所以您最终会在列表的末尾找到sentinel nil。要重新构造列表,您需要将其保留为空列表,即nil,以便(cons 6 nil)创建一个新的list (6);(cons 6 1)将创建一对(6 . 1),但显然由于某种原因,它在实现中无法工作。
如果希望将列表中的()元素转换为1元素,则必须区分这两种情况。
发布于 2013-11-17 20:23:30
你的问题是:
((null? n) 1)因此,当您尝试获取一个空列表的值时,您将得到一个整数,它不是一个列表。当你用一个列表调用你的函数时,你会得到这样的信息:
(cons 1 (cons 2 (cons 6 1)))这不管用。为了修复您的函数,您应该尝试如下:
((null? n) n)https://stackoverflow.com/questions/20035537
复制相似问题