开始计划(LISP)处理列表和附加值

时间:2012-10-04 03:09:48

标签: lisp scheme racket

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

例如:

用户传递3和7:

输出应为(3 4 5 6)

我试图这样做并使用递归,但我正在努力:

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

2 个答案:

答案 0 :(得分:4)

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

(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,直到达到{{1}此时递归结束。

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

<强>更新

现在您已经发布了迄今为止所写的代码,我可以向您显示正确的答案。请注意括号[end的右括号在if部分之后]并且空格[elseif(不同],它们很重要在Scheme中有很多。还要正确缩进代码,它会帮助你找到很多错误:

if (

现在,您可以看到(define (createlist start end) (if (= start end) '() (cons start (createlist (+ 1 start) end)))) 如何正确填充。

答案 1 :(得分:1)

以下是一些建议(不试图泄露整个解决方案):

  • 使用cons代替append

  • 使用缩进来显示程序的结构

  • if没有其他值 - 我怀疑你的意思是最后一行 - 你必须重新排列括号。此外,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的相同值进行递归。你应该改变哪一个,以什么方式改变?