我正在尝试创建一个带2个数字的函数,并使用第一个数字作为起始编号创建一个列表,并使用第二个数字作为结束值,同时填写起始和结束数字之间的值。
例如:
用户传递3和7:
输出应为(3 4 5 6)
我试图这样做并使用递归,但我正在努力:
(define (createlist start end)
(if(= start end)
'())
(cons start '())
(createlist (+ 1 start) end))
答案 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 Schemer或How to Design Programs,这两本书都会教你如何在列表上为这种递归问题构建解决方案。
<强>更新强>
现在您已经发布了迄今为止所写的代码,我可以向您显示正确的答案。请注意括号[end
的右括号在if
部分之后]并且空格[else
与if(
不同],它们很重要在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
。你的意思是第二个list
是createlist
吗?请记住,它需要2个参数
如果您不想要无限递归,请确保更改参数以使它们更接近完成。换句话说,您不希望使用start
和end
的相同值进行递归。你应该改变哪一个,以什么方式改变?