我正在尝试创建一个需要 2 个数字的函数,并将使用第一个数字作为起始数字,将第二个数字作为结束值创建一个列表,同时填写起始数字和结束数字之间的值。
例如:
用户通过 3 和 7:
输出应该是 (3 4 5 6)
我试图这样做并使用递归,但我很挣扎:
(define (createlist start end)
(if(= start end)
'())
(cons start '())
(createlist (+ 1 start) end))
在此类问题的解决方案中发现了一种重复模式,您必须在此过程中使用递归构建一个列表。让我说明一般步骤,我会让你填空:
(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 Schemer或How 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))))
现在您可以看到如何<???>
正确填充。
以下是一些建议(不试图放弃整个解决方案):
使用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
从其体内调用。你的意思是第二list
个createlist
?请记住,它需要 2 个参数
如果您不想要无限递归,请确保更改参数以使它们更接近完成。换句话说,您不想使用 and 的相同值进行start
递归end
。你应该改变哪一个,以什么方式?