在 Scheme 中分隔数字的数字
Separating the digits of a number in Scheme
我正在尝试编写一个程序来分隔方案中数字的数字。我将任意长度的数字作为输入。输出将是 n
number of 1
s,其中 n 是数字的长度。例如:- 123 将输出 1 1 1。
但是,我的代码只输出 1 一次。
为什么会这样?我的代码有什么错误?
(define (separate x)
(cond ((= 0 x) 0 )
((> 0 x) (separate (/ x 10))))
1)
此外,如何将号码的实际数字添加到列表中?我对方案中的列表感到困惑。
你的代码输出 1
因为在最后一行你 return:
1)
它完全忽略了 cond
表达式的值(在 Scheme 中只有最后一个表达式的值被 returned),而且你没有对 return 的结果做任何事情递归调用。
如果你想 return 一个 list 然后你的基本情况改变 - 你必须 return 一个初始列表并在递归步骤中添加一个新的使用 cons
添加到该列表的元素:这是构建输出列表的标准模板。
此外,请注意询问 (< x 10)
是否是更好的基本情况,如果 x
恰好是 0
(边缘情况)我们必须 return - 元素列表,而不是 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
输出符合预期:
(separate 123)
=> '(1 1 1)
我正在尝试编写一个程序来分隔方案中数字的数字。我将任意长度的数字作为输入。输出将是 n
number of 1
s,其中 n 是数字的长度。例如:- 123 将输出 1 1 1。
但是,我的代码只输出 1 一次。
为什么会这样?我的代码有什么错误?
(define (separate x)
(cond ((= 0 x) 0 )
((> 0 x) (separate (/ x 10))))
1)
此外,如何将号码的实际数字添加到列表中?我对方案中的列表感到困惑。
你的代码输出 1
因为在最后一行你 return:
1)
它完全忽略了 cond
表达式的值(在 Scheme 中只有最后一个表达式的值被 returned),而且你没有对 return 的结果做任何事情递归调用。
如果你想 return 一个 list 然后你的基本情况改变 - 你必须 return 一个初始列表并在递归步骤中添加一个新的使用 cons
添加到该列表的元素:这是构建输出列表的标准模板。
此外,请注意询问 (< x 10)
是否是更好的基本情况,如果 x
恰好是 0
(边缘情况)我们必须 return - 元素列表,而不是 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
输出符合预期:
(separate 123)
=> '(1 1 1)