Scheme 方案阶乘(事实*1)问题

Scheme 方案阶乘(事实*1)问题,scheme,Scheme,我是Scheme的新手,所以请原谅我的问题:我有一个计算数字列表的阶乘的函数,但它在结果中最后一个数字之前给了我一个句点。我哪里做错了 代码: 输出: 您所做的是创建一个。试试这个: (define fact* (lambda (l) (cond ((null? (cdr l)) (list (fact (car l)))) (else (cons (fact (car l)) (fact* (cdr l))))))) 在第四行中添加

我是Scheme的新手,所以请原谅我的问题:我有一个计算数字列表的阶乘的函数,但它在结果中最后一个数字之前给了我一个句点。我哪里做错了

代码: 输出:
您所做的是创建一个。试试这个:

(define fact*
   (lambda (l)
     (cond
       ((null? (cdr l)) (list (fact (car l))))
       (else
        (cons (fact (car l)) (fact* (cdr l)))))))
在第四行中添加
列表
,应该可以实现您所期望的效果。更好的方法可能是:

(define fact*
   (lambda (l)
     (cond
       (null? l) '())
       (else
        (cons (fact (car l)) (fact* (cdr l)))))))

这允许您的
fact*
函数处理空列表,并减少调用
fact

的位置,使用
append
而不是
cons
cons
用于构造对,这就是为什么使用“.”分隔对的元素。下面是一个例子:

(define (factorial n)
  (if (<= n 1)
      1
      (* n (factorial (- n 1)))))

(define (factorial-list l)
  (if (null? l)
      '()
      (append (list (factorial (car l))) 
              (factorial-list (cdr l)))))
(定义(阶乘n)
(如果(用户已经指出了由于您的
事实*
功能而获得不正确列表的原因。我只想指出,您可以使用
地图

(define fact*
  (lambda (l)
    (map fact l))

(fact* '(3 6 7 2 4 5))

map
将函数和列表作为参数,并将函数应用于列表中的每个元素,生成一个新的列表。

谢谢!有没有办法用Scheme原语实现这一点?列表是原语吗?我编辑后在您的上述评论后添加了第二个实现。这回答了您的问题吗?啊,太棒了!我的“小Schemer”知识暂时被遗忘了。谢谢!我不知道你是否知道(或者它是否相关),但是有一个叫做
map
的scheme原语。它所做的是将给定的函数应用于给定列表的每个成员。所以你可以将
fact*
定义为
(define fact*(lambda(l)(map fact l)))
,它的工作方式也是一样。当然,你应该知道如何在不使用
map
的情况下先做这件事!哦!刚刚注意到我后来的回答!你能扩展一下吗?当我把一个原子压缩到一个列表上时,“.”为什么会被插入我的列表中?一个“对”是一个包含两个原子的对象。“列表”是一个对序列,其属性是每对的
cdr
是另一个列表,但列表的末尾由“空列表”原子表示。因此
(cons'a(cons'b(cons'c'()))
是一个正确的列表,但是
(cons'a(cons'b'c))
被称为“不正确的列表”因为第二个cons的
cdr
不是一个列表。因为在最后一步中,您正在构造一个由列表和原子组成的对,例如,
(cons'(20 21)120)
=>
((20 21).120)
。要使其正常工作,您需要将120转换为一个列表。
(define (factorial n)
  (if (<= n 1)
      1
      (* n (factorial (- n 1)))))

(define (factorial-list l)
  (if (null? l)
      '()
      (append (list (factorial (car l))) 
              (factorial-list (cdr l)))))
(define fact*
  (lambda (l)
    (map fact l))

(fact* '(3 6 7 2 4 5))