3

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

例如:

用户通过 3 和 7:

输出应该是 (3 4 5 6)

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

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

2 回答 2

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直到达到end,此时递归结束。

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

更新:

现在您已经发布了到目前为止编写的代码,我可以向您展示正确的答案。请非常小心括号 [ an 的右括号if放在该else部分之后] 和空格 [ if(is not the same as if (],它们在 Scheme 中很重要。同时正确缩进你的代码,它会帮助你找到很多错误:

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

现在您可以看到如何<???>正确填充。

于 2012-10-04T03:30:11.717 回答
1

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

  • 使用cons而不是append

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

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

    (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 个参数

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

于 2012-10-04T03:19:33.327 回答