Racket中Lambda生成预期嵌套列表的实现问题求助
我懂你遇到的问题了!你现在的代码之所以输出不符合预期,主要是两个小问题在作祟:
首先,你写的'(omega (- n 1))是字面量引用,Racket不会去执行里面的(omega (- n 1))递归调用,只会把omega、-、n、1这些符号原样当作列表元素返回,这就是为什么你会看到omega (- n 1)出现在结果里。
其次,你用了cons来组合结果,但cons的作用是把第一个参数作为新列表的首元素,第二个参数作为剩余列表;而你的预期是把前一次递归的所有元素都保留,再在末尾追加前一次结果的列表形式,这时候应该用append而不是cons。另外,你给n=0返回的是符号Φ,但后续递归需要列表类型才能拼接,所以最好把n=0的返回值改成列表'(Φ),这样类型更统一,操作也更顺畅。
下面是修正后的代码,完全符合你的预期:
#lang racket (define (omega n) (if (= n 0) '(Φ) (append (omega (- n 1)) (list (omega (- n 1))))))
测试一下输出:
(omega 0)
'(Φ)
(omega 1)
'(Φ '(Φ))
(omega 2)
'(Φ '(Φ) '(Φ '(Φ)))
如果你一定要让n=0返回符号Φ(而不是列表),也可以调整代码适配这种情况,只是稍微复杂一点:
#lang racket (define (omega n) (if (= n 0) 'Φ (append (if (= (- n 1) 0) (list (omega (- n 1))) (omega (- n 1))) (list (omega (- n 1))))))
这个版本的测试输出也完全符合你的要求:
(omega 0)
'Φ
(omega 1)
'(Φ '(Φ))
(omega 2)
'(Φ '(Φ) '(Φ '(Φ)))
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

