我一直在DrRacket工作,试图创建一个“前缀”功能(#lang racket)。它应该将两个列表作为输入,如果#t
为空,或者等于pf
的开头,则应输出ls
。
我的问题是,当pf
不是ls
的前缀且ls
不为空时,我的代码似乎根本不会返回任何内容。如果我将if语句中的#f
替换为其他内容(例如'()
),它将正确返回,但如果我尝试捕获'()
并根据该输出提供输出,它给出了没有意义的结果(比如说'()
不为空,或者'()
不等于'()
)。它似乎与在cond语句中使用if语句有关。谁能告诉我它在做什么,或者为什么?有可能使这段代码正常工作,还是我需要以另一种方式重做呢?
感谢您的帮助!
(define prefix
(lambda (pf ls)
(cond
[(null? pf) #t]
[(null? ls) #f]
[(if (equal? (car pf) (car ls)) (prefix (cdr pf) (cdr ls)) #f)])
))
答案 0 :(得分:8)
在if
条件下cond
通常表明做错了。我想你的意思是这样说:
(define prefix
(lambda (pf ls)
(cond
[(null? pf) #t]
[(null? ls) #f]
[(equal? (car pf) (car ls)) (prefix (cdr pf) (cdr ls))]
[else #f])))