在 SICP 中推广素数对

2024-01-01

我花了一些时间来研究“素数对”的生成SICP 第 2.2.3 节 - 作为常规接口的序列, 例如:

  • (1 3)不,因为总和 = 4
  • (1 4)是的,因为 sum = 5(素数)

这是我从头开始得到的,有效的:

#lang sicp
; RANGE helper function
(define (range a b) ; a to b
 (if (> a b) nil
     (cons a (range (+ 1 a) b))
 ))
; FILTER helper function
(define (filter func sequence)
  (cond ((null? sequence) nil)
        ((func (car sequence)) (cons (car sequence) (filter func (cdr sequence))))
        (else (filter func (cdr sequence)))))
; PRIME helper function
(define (prime? n)
 (cond ((or (= n 1) (= n 2)) #t)
       ((=(modulo n 2) 0) #f)
        (else ; see if no modulos=0 under length of sqrt(N)
         (= 0 
            (length (filter (lambda (i) (eq? i #t))
               (map (lambda (d) (= (modulo n d) 0)) (range 3 (sqrt n)))))))))
; MAP helper
(define (flatmap func seq)
  (if (null? seq) nil (append (func (car seq)) (flatmap func (cdr seq)))))

以及实际的功能:

; generate pair of two numbers with  1 <=  i < j <= N
(define (get-pairs n)
  (flatmap (lambda (i)
         (map (lambda (j)
                (list i j))
              (range 1 (- i 1))))
       (range 1 n)))

(define (get-prime-pairs n)
  (filter (lambda (p) (prime? (apply + p)))
          (get-pairs n)))

(get-prime-pairs 4)
; ((2 1) (3 2) (4 1) (4 3))

很简约。现在我正在尝试编写相同的函数,该函数不只是执行对,而是执行一个元组size。到目前为止,这是我所掌握的:

(define (get-n-tuples size n)
  (define (get-n-tuples-internal i args)
    (cond ((= i size) (map (lambda (i) (cons i args)) (range 1 n)))
          (else
           (flatmap (lambda (k)
                      (get-n-tuples-internal (+ i 1) (cons k args)))
                    (range 1 n)))))
  (get-n-tuples-internal 1 '()))

(define (get-prime-seqs size num)
  (filter (lambda (p) (prime? (apply + p)))
          (get-n-tuples size num)))

(get-prime-seqs 4 4)
; ...
; (3 2 4 4)
; (2 3 4 4)
; (1 4 4 4))

我发现困难的一件事是通过执行类似的操作来删除函数本身内的重复项(range i (- (min args) 1))。所以我只是用了同样的(range 1 n)对于所有循环。

我如何正确地转换它,以便它模拟初始函数,以便列表中的每个连续数字必须更小,即,如果序列中有三个数字,那么1 <= num1 < num2 < num3 <= N,有效的一对是(4 2 1)但不是(1 2 4) or (5 1 1) ?


您的 2D 情况相当于两个嵌套循环:

    for i in 1 to n
      for j in 1 to (i-1)
        yield (i,j)

flatmap只是执行机制。是的,这就是本质"monads": the "shape"第二个循环的(范围)取决于value (i)由第一个产生;此外,无论循环的深度如何(此处为 2),最内层循环生成的所有值都会按一个顺序输出。

这也是其本质回溯,因为当我们完成所有的js 对于给定的i,控制来了back进入外循环,并且next i依次进行尝试。

回到我们的业务。当然,3D 情况涉及三个嵌套循环:

    for i in 1 to n
      for j in 1 to (i-1)
        for k in 1 to (j-1)
          yield (i,j,k)

一般来说,你希望它概括为m嵌套循环,m = 2,3,4,... .

标准构建方式m嵌套循环是带有递归的。如果我们要使用flatmap那么我们只需要意识到外循环内的所有结构都代表m-1嵌套循环计算:

(define (tuplesND_ ND max_idx)
  (define (loopvals m imax)
    (if (= m 0)      ; at the deepest level
      (list '())     ; no more indices to collect
      (flatmap                 ; splice in, 
           (lambda (i)         ;   for each i...
             (map (lambda (tup)             ;   (back from
                       (cons i tup))        ;    recursion)
                  (loopvals (- m 1)     ; all the results from
                            (- i 1))))  ;   the m-1 inner loops
         (range 1 imax))))     ;   ...in the proper range
  (loopvals ND max_idx))

似乎正在工作:

> (display (tuplesND_ 2 3))
((2 1) (3 1) (3 2))
> (display (tuplesND_ 2 4))
((2 1) (3 1) (3 2) (4 1) (4 2) (4 3))
> (display (tuplesND_ 3 3))
((3 2 1))
> (display (tuplesND_ 3 4))
((3 2 1) (4 2 1) (4 3 1) (4 3 2))
> (display (tuplesND_ 4 5))
((4 3 2 1) (5 3 2 1) (5 4 2 1) (5 4 3 1) (5 4 3 2))

当然那flatmap就性能而言是糟糕的(除非它可作为低级原语使用),其所有常量结构复制和重新分配与所有这些appends.

当然只有在可变地-有挑战性的语言。另一方面,Scheme 拥有其中最重要的原语:set-cdr!. It has能够以自上而下的方式一次性构建列表,无需复制,无需重新分配(这就是假设的内置列表的方式)flatmap也会运行)。突变并没有什么问题,否则是无法观察到的!

通过在我们的方式构建元组into递归,传递一个callback为了从最深层调用,我们让it做我们需要的事情:只需打印每个元组的构造,append! https://stackoverflow.com/a/13256555/849891它到增长列表的右端(为了提高效率,将其引用保持为隐藏状态,因此可以在O(1)时间),或我们选择的任何其他内容。

所以,无需进一步告别,

(define ((tuplesND yield) ND max_idx)
  (define (loops m imax tup)
    (if (= m 0)                  ; at the deepest level,
        (yield (reverse tup))    ; give callback the value
        (for-each                ; otherwise, looping
           (lambda (i)                ; for each i...       
              (loops (- m 1) (- i 1)      ; going into
                     (cons i tup)))       ;   the recursion
           (range 1 imax)))           ; ...in the proper range
    "")       ; (some unimportant value that displays as nothing)  
  (loops ND max_idx '())         ; no indices collected at first
  "")       ; (some unimportant value that displays as nothing)

这会在途中构建元组in,进入最深层次的递归,而不是在途中构建它out,与之前的版本一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SICP 中推广素数对 的相关文章

  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构
  • 将轮分解添加到不定筛

    我正在修改埃拉托色尼的不定筛here https stackoverflow com a 10733621因此 它使用轮分解来跳过比当前仅检查所有赔率的形式更多的组合 我已经弄清楚了如何生成到达轮子上所有间隙所需的步骤 从那里我想我可以用
  • 经验丰富的计划者的 get-first、get-next 和 waddle 函数

    define get first lambda l call with current continuation lambda here set leave here waddle l leave quote define get firs
  • 方案:为什么内部定义比外部定义快?

    我尝试运行下面的程序 define odd internal x define even x if zero x t odd internal sub1 x if zero x f even sub1 x define odd extern
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • 有没有一种简单的方法可以使用 Common Lisp 中的 Python 库?

    在编写 Common Lisp 代码时我真正怀念的一件事是访问 Python 库 包括标准库和第三方模块 CLPython 提供了 Python 功能的有限子集 这阻止了大多数库的使用 因此这对我来说并不是很有用 我希望能够从 Common
  • CMake:如何在多个文件上运行自定义命令来生成源文件?

    我有以下情况 我想编译一些Scheme文件Gambit https github com gambit gambit成可执行文件 为此 我使用 gambit 将所有计划文件翻译 生成为 C 和目标文件 然后将其编译并链接为可执行文件 假设我
  • 如何获取 SICP、Scheme、练习 2.78 等中的 put 和 get 函数

    我正在尝试在 SICP 中做练习 2 78 但 put 和 get 函数未知 我尝试过多种语言 比如相当大 racket r5rs mit scheme mzscheme等 我什至下载了SICP支持 http www neilvandyke
  • 超级丑陋的数字

    所以问题是 编写一个程序来查找第 n 个超级丑数 超级丑数是正数 其所有素数因子都在给定素数列表中 大小为 k 的素数 例如 1 2 4 7 8 13 14 16 19 26 28 32 是给定素数的前 12 个超级丑数的序列 2 7 13
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • 判断一个数是否是质数

    我已经仔细阅读了有关该主题的大量代码 但大多数代码生成的数字一直到输入数字都是素数 但是 我需要的代码仅检查给定的输入数字是否为素数 这是我能够写的 但它不起作用 void primenumber int number if number
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 forge(或其他 JavaScript 方法)生成随机大素数

    我需要在 JavaScript 中生成一个随机大 大约 4096 位 素数 并且我已经在使用 forge Forge 必须有某种生成器来完成此类任务 因为它实现了 RSA 而 RSA 也依赖于随机素数 然而 当你只想获得一个随机素数 类似于
  • 如何让球拍不打印?

    我正在 Racket 中编写一个程序 我正在使用它运行racket foo rkt 这是可行的 除了程序顶层每个表达式的结果都会被打印 即使没有调用打印函数 就好像程序是逐行输入到 REPL 中的 但在这种情况下 我根本不尝试使用 REPL
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要

随机推荐

  • 计算三个加密数字的平均值

    是否可以计算三个加密整数的平均值 对加密方法没有限制 这样做的目的只是隐藏三个数字并求平均值 你似乎正在寻找的东西叫做同态加密 http en wikipedia org wiki Homomorphic encryption 一种加密方案
  • LibGDX FreeType 字体模糊

    我正在使用屏幕高度百分比和设置百分比动态生成字体 显然将来会乘以密度 一些笔记 我正在读取 OTF 文件 使用最新版本的LibGDX 版本1 2 0 我有以下问题 字体有很大的断裂 看起来很模糊 但仅限于medium Large and s
  • 如何在android中滚动tableview

    我有一个要滚动的表格视图 因为数据未显示完整
  • ggplot2 轴标签分组

    我正在尝试使用 ggplot2 构建一个图 在 X 轴上我可以找到某种为变量组添加标签的方法 这是我的代码的最小版本 Bzero lt 100 matrix runif 100 ncol 10 nrow 10 B lt 99 LNtype
  • 横向压平两列,雪花中不重复

    我有一个查询 该查询按两个变量进行分组以获得另一个变量的总数 为了维护我的表结构以供以后计算 我列出了另外两个变量以保存查询的下一阶段 但是 当我尝试稍后对 listagg 列进行两次展平时 我的数据会重复多次 示例 my table id
  • PyQt |信号不在 QThread 中处理,而是在主线程中处理

    在这个简单的 PyQt 演示程序中 我从主线程发出信号 在工作线程中 我连接到它们 但信号处理程序在主线程中运行 from PyQt4 import QtGui QtCore import threading from time impor
  • 使用没有 Surface View 的 Android 相机

    我正在android上开发 我想用相机做一些事情 处理像素的值 但只是在后台 是否可以在没有表面视图的情况下做到这一点 只需使用缓冲区读取像素值并进行处理 感谢每一位可以帮助我的人 从 API 级别 11 开始表面纹理 http devel
  • 哪些 GCC 优化标志和技术在 CPU 上是安全的?

    当编译 链接适用于 ISA 例如 x86 64 的所有实现的 C C 库或程序时 从正确性和运行时性能的角度来看 哪些优化标志是安全的 我希望优化能够产生正确的结果 并且不会对特定 CPU 的性能造成损害 例如 我希望避免优化标志 这些优化
  • SpannableStringBuilder 用正则表达式替换内容

    我有以下代码 我将在其中标记大括号之间的内容SpannableString并删除花括号 但它给出了错误的结果 String text the quic k brown fox jumps over the lazy dog A Quick
  • 嵌套参数无法编译

    我正在尝试将我的代码编译成 Python 3 模块 当我在 IDLE 中选择 运行模块 时它运行良好 但当我尝试创建发行版时收到以下语法错误 File usr local lib python3 2 dist packages simple
  • 生成 CrypoAPI (CAPI) 私钥

    我正在尝试使用静态加密IXml加密器 https learn microsoft com en us aspnet core security data protection extensibility key management vie
  • php 中未定义的函数 mysql_connect()

    我安装了 mysql installer web community 5 6 25 0 apache 2 4 2 x86 no ssl 和 php 5 4 42 Win32 VC9 x86 php 可以与 apache 服务器配合使用 但不
  • 如何增加 MDCTextInputControllerOutlinedTextArea 的高度

    I have assigned a class named MDCMultilineTextField for Uiview from the storyboard This class is used for Multiline Text
  • 生产者消费者 - ExecutorService 和 ArrayBlockingQueue

    我想知道我对使用 ExecutorService 和 ArrayBlockingQueue 的生产者消费者设计的理解是否正确 我知道有不同的方法来实现这个设计 但我想 最终 这取决于问题本身 我必须面对的问题是 我有一个制作人 他从一个大文
  • jQuery 的 crossdomain.xml?

    我有一个托管在 Tumblr 上的博客 我有一个单独的主机 我在其中存储我制作的主题的所有图像 js css 等 不过 我也在使用查询加载器2 http www gayadesign com diy queryloader2 preload
  • 将变量注入 webpack

    我试图将一个变量注入到 webpack 包中的每个模块中 以便获得每个文件的 JS 错误的调试信息 我已启用 node filename true webpack 中的当前文件路径 https stackoverflow com quest
  • 为什么 form.submit() 不会触发“提交”事件?

    我正在使用 JavaScript submit 函数提交表单 form submit 但是当我使用 addEventListener 捕获我的提交事件时 它不起作用 form addEventListener submit function
  • 如何避免散点图/ggplot 中相同数据点的标签重叠?

    是否有任何函数等可以避免散点图中相同数据点的数据标签重叠 我已经检查了对 textxy direct label 和 geom text 的各种问题 答复 但没有成功 也许这根本不可能 以下是相关数据的示例 structure list c
  • 每次我登录游戏时,Unity Facebook SDK 都会不断要求我确认登录

    我正在使用 Unity3D 2018 2 6f1 和 Facebook SDK 这是用户单击登录按钮后我用来登录 Facebook 的代码 FB Init gt FB LogInWithReadPermissions new List
  • 在 SICP 中推广素数对

    我花了一些时间来研究 素数对 的生成SICP 第 2 2 3 节 作为常规接口的序列 例如 1 3 不 因为总和 4 1 4 是的 因为 sum 5 素数 这是我从头开始得到的 有效的 lang sicp RANGE helper func