gpt4 book ai didi

lisp - 创建映射的固有方法,以便可以传递向量的每个元素以及标量

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:56 24 4
gpt4 key购买 nike

我将一个函数放在一起,该函数可以执行经过修改的埃拉托色尼筛法,该筛法确实有效。我意识到这是一个迭代将提供比映射更大的速度优势的示例,但这不是以这种方式编写的重点。

这是代码

(defun sieve (n)
(let ((primes (list)))
(do ((i 2 (1+ i)))
((> i n))
(if (not
(find 0 (mapcar (lambda (x) (mod i x)) primes)))
(setf primes (append primes (list i)))))
primes))

(print (sieve 100000))

这在 sbcl 中运行大约 3 秒,并打印所有小于 100k 的素数。 clisp 大约需要 8 秒。

我想构建一个素数向量,然后提供一个映射函数,用已知素数向量除以一个标量(它恰好是下一个要测试它是否为素数的数字)以返回一个新向量的模值。如果任何模值为零,则它不是质数。

如果它是素数,我想将该素数添加到素数向量中并继续。我使用 make-array 创建一个 :adjustable 集合没有遇到任何问题,但后来我遇到了障碍:

我不知道如何创建一个 map ,让我可以通过向量作用于标量并返回一个向量。为了解决这个问题,我重新编写了代码以使用列表和使用 mapcar。

正如我所说,它有效,但我相信每次都存储列表的 setf 效率非常低。 (尽管我正在使用映射函数,但我做了很多不必要的除法)。

我能找到的每个数组映射函数都要求输入是向量,输出是最小输入向量大小的单个向量。

所以,真正的问题是,是否有一种内在的方法来创建一个映射,以便可以将向量的每个元素以及一个标量传递给一个函数,该函数产生一个与输入向量大小相同的输出向量?

最佳答案

CL-USER 50 > (map 'vector #'1+ #(1 2 3 4))
#(2 3 4 5)

CL-USER 51 > (map 'vector
(lambda (e)
(* e 1234))
#(1 2 3 4))
#(1234 2468 3702 4936)

关于lisp - 创建映射的固有方法,以便可以传递向量的每个元素以及标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43375302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com