在Scheme中分隔数字的数字

时间:2015-02-07 11:25:52

标签: scheme

我正在尝试编写一个程序来分隔方案中数字的数字。我把任意长度作为输入。输出将为n1个,其中n是数字的长度。例如: - 123将输出1 1 1。 但是,我的代码只输出一次。

为什么会这样?我的代码中有什么错误?

(define (separate x)
    (cond ((= 0 x) 0 )
          ((> 0 x) (separate (/ x 10))))
    1) 

另外,如何将数字的实际数字添加到列表中?我对计划中的列表感到困惑。

1 个答案:

答案 0 :(得分:2)

您的代码输出1,因为在最后一行中您返回的是:

1)

它完全忽略cond表达式的值(在Scheme中只返回最后一个表达式的值),此外你没有对递归调用的结果做任何事情。

如果要返回列表,那么基本情况会发生变化 - 您必须返回一个初始列表,并在递归步骤中使用cons向该列表添加一个新元素:这就是用于构建输出列表的标准模板。

另外,请注意,询问(< x 10)是否是更好的基本情况,如果x碰巧是0(边缘情况),我们必须返回单个元素列表,而不是{ {1}}。假设非负输入,这应该有效:

0

输出符合预期:

(define (separate x)
  (cond ((< x 10) '(1)) ; base case: return a single-element list
        (else (cons 1   ; recursive step: add `1` to the output list
                    (separate (quotient x 10)))))) ; and advance recursion