繁体   English   中英

计划因素(事实* l)问题

[英]Scheme Factorial (fact* l) Question

我是Scheme的新手,请原谅我的问题:我有一个计算数字列表的阶乘的函数,但它给出了结果中最后一个数字之前的一段时间。 我哪里错了?

码:

#lang scheme

 (define fact
    (lambda (n)
      (cond
        ((= n 0) 1)
        ((= n 1) 1)
        (else (* n (fact (- n 1)))))))

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

输出:

> (fact* '(3 6 7 2 4 5))
(6 720 5040 2 24 . 120)

你所做的是创建一个不正确的列表 尝试这个:

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

在第四行添加list应该可以使您按预期工作。 更好的可能是以下内容:

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

这允许您的fact*函数在空列表上工作,以及减少您调用fact的地方数量。

其他 答案指出了为什么你因为fact*功能而得到一个不正确的列表的原因。 我只想指出你可以使用更高阶的函数 map

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

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

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

使用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)))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM