【问题标题】:LISP Recursion On Numbers数字上的 LISP 递归
【发布时间】:2015-12-02 12:33:16
【问题描述】:

我在 Scheme 中编写的函数 showlength 有问题:

(define showlength
  (lambda (m lst)
    (cond ((number? m) (list (cons m lst) 
                             (+ 1(length lst))))    
          ((pair? m) (let* ([x (cdr m)]
                            [y (car m)])
                       (showlength x lst)
                       (showlength y lst))))))

该代码旨在获取一个数字或一对数字和一个列表(lst),并返回一个列表,显示列表中包含的所有值和列表的长度。当我只有一些示例时,该程序适用:

(showlength 2 '())

并返回

((2) 1)

但是当我尝试解决由一对示例组成的问题时

(showlength (cons 2 3) ' ())

返回值的含义

((0 . 1) 3 2) 3)

它显示

((2) 1)

我的代码有什么问题?

编辑:对于那些代码不是很清楚的人。当使用一对数字时,该代码旨在将该对的 cdr 添加到列表中。然后它的意思是将对的汽车添加到列表中(其中列表已经包含上面对的 cdr),然后返回列表及其长度

【问题讨论】:

  • 我建议您以可读的方式格式化和缩进您的代码。这会很有帮助。
  • 您将丢弃(showlength x lst) 的结果(在您的示例中为(showlength 3 '()))并返回(showlength y lst)showlength 2 '()))。非常不清楚您的功能应该做什么-您的示例似乎都与您的描述不符。第一种,“列表中包含的所有值”什么都不是,列表的长度为0。
  • Rainer Joswig 这对你来说可读性够吗?抱歉,这还是个业余爱好者
  • molbdnilo 我认为从 (showlength x lst) 获得的值(列表和长度)将更新 lst,然后我将使用更新后的值来编译 (showlength y lst) 函数和返回值

标签: recursion scheme


【解决方案1】:

问题在于,在您的 let 语句中,您有两个独立的调用来显示长度,而您的实现只是返回第一个的值。

在方案中,一个函数只返回一个值(通常,一些实现提供了特殊的机制来允许一个值期望并接受多个返回值。)

我的问题是,您希望零从哪里来? m中的最小值为2,当lst的length为0时,length可以自行返回的最小值为1。 无论你在做什么,你都需要退后一步检查你的假设,有些事情是不对的。

(define showlength
  (lambda (m lst)
    (cond ((number? m) (list (cons m lst) 
                             (+ 1(length lst))))    
          ((pair? m) (let* ((x (cdr m))
                            (y (car m)))
                       (cons (showlength x lst)
                             (showlength y lst)))))))

将返回值与 cons 绑定在一起可以得到一个值而不会丢失任何东西,但这不是你想要的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多