如何修复Lisp乘法表生成代码输出嵌套列表而非扁平化列表的问题
问题根源
你的代码生成多层嵌套列表的核心问题是列表拼接逻辑错误:list 函数会将传入的每个参数都作为新列表的独立元素,你每次递归时把前一步返回的列表整体作为第一个元素传入list,就会不断嵌套生成多层括号的结构。
修复方案
基础修复(直接符合需求)
将list替换为append,把当前计算结果包装为单元素列表后和递归结果拼接,即可得到扁平化的升序列表:
(define (multiplying-table n value) (cond ((= n 0) '()) (else (append (multiplying-table (- n 1) value) (list (* n value))))))
调用(multiplying-table 10 3)即可直接返回'(3 6 9 12 15 18 21 24 27 30),符合你的预期。
优化版本(尾递归,避免大数值n时栈溢出)
如果需要计算的n值较大,推荐使用尾递归写法降低栈消耗:
(define (multiplying-table n value) (define (iter cur acc) (if (> cur n) (reverse acc) (iter (+ cur 1) (cons (* value cur) acc)))) (iter 1 '()))
内容的提问来源于stack exchange,提问作者Carlos David
相关产品推荐
相关产品推荐

