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

Isa*_*aac 2 scheme

我是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)))))))
Run Code Online (Sandbox Code Playgroud)

输出:

> (fact* '(3 6 7 2 4 5))
(6 720 5040 2 24 . 120)
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 8

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

(define fact*
   (lambda (l)
     (cond
       ((null? (cdr l)) (list (fact (car l))))
       (else
        (cons (fact (car l)) (fact* (cdr l)))))))
Run Code Online (Sandbox Code Playgroud)

的加入list为你期望在第四行应该使这项工作.更好的可能是以下内容:

(define fact*
   (lambda (l)
     (cond
       (null? l) '())
       (else
        (cons (fact (car l)) (fact* (cdr l)))))))
Run Code Online (Sandbox Code Playgroud)

这允许您的fact*功能在空列表上工作,并减少您拨打电话的地方数量fact.


Jon*_*nas 5

其他 答案已经指出,为什么你不正确的列表,你的结果的原因fact*的功能.我只想指出你可以使用高阶函数 map:

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

(fact* '(3 6 7 2 4 5))
Run Code Online (Sandbox Code Playgroud)

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