【问题标题】:Beginning Scheme (LISP) dealing with lists and appending values处理列表和附加值的开始方案 (LISP)
【发布时间】:2012-10-04 12:32:08
【问题描述】:

我正在尝试创建一个接受 2 个数字的函数,并将使用第一个数字作为起始数字,将第二个数字作为结束值创建一个列表,同时填写起始和结束数字之间的值。

例如:

用户通过 3 和 7:

输出应该是 (3 4 5 6)

我试图这样做并使用递归,但我很挣扎:

 (define (createlist start end)
   (if(= start end)
      '())
   (cons start '())
    (createlist (+ 1 start) end))

【问题讨论】:

  • 使用cons 并向后工作——从尾部开始构建。此外,需要再次调用该函数以使其递归。

标签: lisp scheme racket


【解决方案1】:

在此类问题的解决方案中发现了一种重复模式,您必须在此过程中使用递归构建一个列表。让我说明一般步骤,我会让你填空:

(define (createlist start end)
  (if (= <???> <???>) ; the problem is solved when start and end are the same
      '()             ; lists end in null
      (cons <???>  ; if we are not done yet, we `cons` the current value of start
            (createlist <???> end)))) ; with the result of calling the recursion
            ; notice that start is one step closer to the end, so we increment it

算法的思想是在每一步我们将当前的start值添加到正在使用cons构建的列表中,并递增start直到它达到end,此时递归结束。

你应该看看The Little SchemerHow to Design Programs,这两本书都会教你如何为这种列表上的递归问题构建解决方案。

更新:

现在您已经发布了到目前为止编写的代码,我可以告诉您正确的答案。请注意括号[if 的右括号在else 部分之后] 和空格[if(if ( 不同],它们在Scheme 中很重要。同时正确缩进你的代码,它会帮助你发现很多错误:

(define (createlist start end)
  (if (= start end)
      '()
      (cons start
            (createlist (+ 1 start) end))))

现在您可以看到&lt;???&gt; 是如何正确填充的。

【讨论】:

  • 它在哪里创建列表?
  • @cougar 连续调用cons 创建一个列表。例如:(cons 1 (cons 2 '())) 创建列表'(1 2),注意列表必须以'() 结尾,即空列表。
  • 好吧,这是有道理的。我想在底部代码中增加 start 对吗?
  • 没错,您现在就在正确的轨道上理解和解决它!
  • 我正在尝试做(+ start 1),但我一直卡在一个无限循环中。它甚至没有保存价值
【解决方案2】:

这里有一些建议(不试图放弃整个解决方案):

  • 使用cons 而不是append

  • 使用缩进显示程序结构

  • if 没有 else 值——我怀疑你的意思是最后一行是它——你必须重新排列括号。此外,常见的风格不赞成if(list(——改用if (list ((注意空格)。示例:

    (define (my-function a b c)
      (if (= a 3)   ;; note the space between if and (
          b         ;; the 'then' line
          c))       ;; the 'else' line
    
  • 如果你在递归,你必须在它的体内调用createlist。你是说第二个listcreatelist 吗?请记住,它需要 2 个参数

  • 如果您不想要无限递归,请确保更改参数以使其更接近完成。换句话说,您不想使用startend 的相同值进行递归。你应该改变哪一个,以什么方式?

【讨论】:

  • 我在想我可以继续增加起始值
  • 如何使用 cons 将项目添加到列表末尾?
  • 那么,你有 '(a b c) 并且你想添加 'd?如果您不介意以 '((a b c) d) 结尾,答案很简单。如果您想要 '(a b c d) 作为结果,那么答案(再次)涉及递归。所以想一想,然后带着一个全新的问题回来,说明你的想法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多