Lisp中最长的元素链

2023-12-13

语句:找出最长的字符链并返回。 例如:输入:'(1 2 2 3 3 3 4 4 4 4 5 6 )输出:'(4 4 4 4)

问题:我可以设法识别列表中的所有不同组并比较它们,但无法让函数返回正确的子集列表。它仅返回最后分析的组。

code:

(define finalL (list))
(define (sameNum liste) 
  (if (or (null? liste) (null? (cdr liste)))
      ;; true
      '()
      ;; false
      (let ([lcdr (sameNum (cdr liste))]) 
        (if (eqv? (car liste) (car(cdr liste)) )
            ;; true
            (if (= (length liste) 2)
                ;; true
                (cons (car liste) (cons (car(cdr liste)) lcdr)) 
                ;; false
                (if (or (not(eqv? (car(cdr liste)) (car(cdr (cdr liste))) )) (null? (cdr liste)) )
                    (cons (car liste) (cons (car(cdr liste)) lcdr)) ;true
                    (cons (car liste) lcdr))) ; false
             ;; false
            (if (let ((x (length lcdr)) (y (length finalL))) (< x y))
                ;; true
                (crushL finalL lcdr)
                ;; false
                finalL)))))
;; crush L1 and replace by value of L2
(define (crushL L1 L2)
  (if (null? L1)
      ;; true
      (cons L2 L1)
      ;; false
      (crushL (cdr L1) L2)))

诀窍是在你浏览清单时保留四件事:

  • 当前链(注意:您可以向后构建这些链,因为所有元素都是相同的!);
  • 有多长?
  • 你见过的最长的链条;
  • 多久that was.

然后,您根据正在查看的元素是否与当前链中的第一个元素相同(仍在构建相同的链)或不同(开始新的链)做出决定,如果您仍在构建相同的链,该链现在是否是最长的。

像这样:

(define (longest-chain l)
  (let lc-loop ([tail l]
                [current-length 0]
                [current-chain '()]
                [longest-length 0]
                [longest-chain '()])
    (cond [(null? tail)
           ;; we're done: return the longest chain
           longest-chain]
          [(and (not (null? current-chain))
                (eqv? (first tail) (first current-chain)))
           ;; building on a current chain
           (let ([chain (cons (first tail) current-chain)]
                 [chain-length (+ 1 current-length)])
             (if (> chain-length longest-length)
                 ;; the current chain is now the longest
                 (lc-loop (rest tail)
                          chain-length chain
                          chain-length chain)
                 ;; it's not the longest yet
                 (lc-loop (rest tail)
                          chain-length chain
                          longest-length longest-chain)))]
          [else
           ;; starting a new chain
           (lc-loop (rest tail)
                    1 (list (first tail))
                    longest-length longest-chain)])))

补充一点:如果有多个最长链,该函数返回哪一个?你如何改变它,让它做出另一个选择?或者甚至是一个random choice!


注意上面版本的函数使用named let,这是Scheme 中的标准构造。如果你不想使用它,你可以将它变成一个显式函数:

(define (longest-chain l)
  (define (lc-loop tail
                   current-length current-chain
                   longest-length longest-chain)
    (cond [(null? tail)
           ;; we're done: return the longest chain
           longest-chain]
          [(and (not (null? current-chain))
                (eqv? (first tail) (first current-chain)))
           ;; building on a current chain
           (let ([chain (cons (first tail) current-chain)]
                 [chain-length (+ 1 current-length)])
             (if (> chain-length longest-length)
                 ;; the current chain is now the longest
                 (lc-loop (rest tail)
                          chain-length chain
                          chain-length chain)
                 ;; it's not the longest yet
                 (lc-loop (rest tail)
                          chain-length chain
                          longest-length longest-chain)))]
          [else
           ;; starting a new chain
           (lc-loop (rest tail)
                    1 (list (first tail))
                    longest-length longest-chain)]))
  (lc-loop l 0 '() 0 '()))

这与上面的版本完全等效。如果您对内部不满意defines,然后你可以转动lc-loop进入顶级定义。

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

Lisp中最长的元素链 的相关文章

  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

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

    I binded function semantic symref to key C c C r like this global set key kbd C c C r semantic symref everytime I presse
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • 我为什么要学习 Lisp? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number
  • 方案中的配对组合

    我试图找到可以使用方案中的 N 对列表进行的各种组合 这是我到目前为止所处的位置 define pair combinations list of pairs if null list of pairs nil let first caar
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • Racket 与Scheme 有何不同?

    Racket 是Scheme 的后代 Racket 与 R6RS 有何不同 它添加了什么 删除了什么 或者只是有所不同 我知道 Racket 不仅仅是一种语言 它还是一个语言平台 但我指的是主要的 Racket 方言 Racket 最终基于
  • 如何更改 DrRacket 中 R6RS 的打印行为以像 #langracket 一样打印结果

    当我在 IDE 版本 5 3 5 2013 06 18 f 中运行程序时 对于 lang racket eg lang racket 4 5 10 2 When pressing Run gt the interaction window
  • Lisp 函数如何记住这段代码中的状态?

    我从网站上看到一段代码http www ccs neu edu home shivers newstyle html http www ccs neu edu home shivers newstyle html gt defun elem
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的
  • 如何在 Ubuntu Karmic 上安装 LFE?

    Erlang 已经安装 dpkg l grep erlang ii erlang 1 13 b 3 dfsg 2ubuntu2 Concurrent real time distributed function ii erlang appm
  • OS X 的最佳方案或 LISP 实现是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找一个 Scheme 甚至 LISP 的版本 我可以用它来恢复一些丢失的 Lisp 开发技能 一些网络功能固然很好 但不是必需的 我研究
  • Letrec 有什么好处?

    在阅读 老练的阴谋家 时 我开始了解letrec 我理解它的作用 可以用 Y Combinator 复制 但这本书正在使用它来代替已经重复出现的内容defined 函数对保持静态的参数进行操作 使用旧函数的示例defined 函数本身重复出
  • Common Lisp 中的重复元素 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试创建一个函数two argum
  • Common Lisp 的优先级队列?

    我一直在到处寻找可用的 Common Lisp 优先级队列实现 但到目前为止 我还没有太多运气 由于我对 Common Lisp 相当陌生 每当我看到来自 REPL 的巨大警告 错误转储时 我真的不知道该怎么办 我发现的所有优先级队列实现似
  • Lisp 随机化并使用两个函数从列表中拉入另一个列表

    好的 我是 lisp 的新手 我已经在这个程序上工作了几天 以了解 lisp 并研究 lisp 的某些部分 例如 cons cdr let funcall 和其他一些部分 我正在尝试创建一台随机分配颜色的糖果机 我已经多次运行这段代码 起初
  • Eval 不适用于未展开的宏引用

    在 Common Lisp 中我可以这样做 src gt defmacro 宏 hello 你好 eval 宏 你好 没问题 在 Clojure 中 defmacro 宏 你好 你好 eval 宏 你好 给我一个错误 我做错了什么吗 Clo

随机推荐