首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案因子

方案因子
EN

Stack Overflow用户
提问于 2013-11-17 20:09:16
回答 2查看 3.5K关注 0票数 1

我知道通过这样做可以编写一个简单的阶乘函数:

代码语言:javascript
复制
(define fact
  (lambda (n)
    (if (= n 0) 1
        (* n (fact (- n 1)))))

但是,只有当您发送一个数字时,这才会起作用;如果您发送列表或符号,则会出现错误。所以我想做的是让它适用于所有的东西,如果是一个列表,做列表中每个单独元素的阶乘。以下是我所拥有的:

代码语言:javascript
复制
(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)))))))

我不太擅长计划,但我需要能够了解基本知识。除了一个列表之外,每个输入都正常工作。

代码语言:javascript
复制
> (listFact '())

1

(listFact 'a)

'a

(listFact 4)

24

(listFact‘(12,3))

缺点:第二个参数必须是一个列表,但是收到了6和1。

我想做的最后一件事是返回:

(名单1 2 6)

我不知道为什么不行。如果有人可以帮助我在不改变整个代码结构(即不要使用apply/map或多个函数)的情况下解决这个问题,我们将不胜感激。我想唯一搞砸的是那个有缺点的人。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-17 20:17:08

只需替换

代码语言:javascript
复制
(cond
     ((null? n) 1)

使用

代码语言:javascript
复制
(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元素,则必须区分这两种情况。

票数 2
EN

Stack Overflow用户

发布于 2013-11-17 20:23:30

你的问题是:

代码语言:javascript
复制
((null? n) 1)

因此,当您尝试获取一个空列表的值时,您将得到一个整数,它不是一个列表。当你用一个列表调用你的函数时,你会得到这样的信息:

代码语言:javascript
复制
(cons 1 (cons 2 (cons 6 1)))

这不管用。为了修复您的函数,您应该尝试如下:

代码语言:javascript
复制
((null? n) n)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20035537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档