我正在编写Scheme中的程序,并且在这一部分中遇到了困难。下面是一个让我的问题清晰的例子
如果列表中的第一个元素与列表中的最后一个元素相同,(endsmatch lst)应返回#t,否则返回#f。
例如: (endmatch'(s t u v w x y z))应返回:#f
和
(endsmatch(LIST'j'k'l'm'n'o'j))应该返回:#t
这是我到目前为止所做的(只是错误处理)。我遇到的主要问题是解决这个递归。我知道有更简单的解决方案不是递归的,但我需要使用递归来解决这个问题。
到目前为止我的代码:
(define (endsmatch lst)
(if (not(list? lst))
"USAGE: (endsmatch [list])"
(if (or (null? lst)
(= (length lst) 1))
#t
(equal? ((car lst)) (endsmatch(car lst)))
)))
我相信我的代码从“(等于?”开始,它被破坏并且不起作用。这也是我相信递归的地方。感谢任何帮助!
答案 0 :(得分:0)
最简单的方法是使用(递归)辅助函数来进行循环:
(define (endsmatch lst)
(define (helper no1 lst)
(if (null? (cdr lst))
(equal? no1 (car lst))
(helper no1 (cdr lst))))
(if (or (not (list? lst)) (null? lst))
"USAGE: (endsmatch [list])"
(helper (car lst) lst)))
我将lst
而非(cdr lst)
作为最后一行中的第二个参数传递的原因是它也适用于单元素列表。
答案 1 :(得分:0)
我倾向于在编程时使用KISS。又名。 "保持简单,愚蠢!" 在这方面,我会为以下方面做准备:
(define (ends-match? lst)
(or (null? lst)
(equal? (car lst)
(last lst))))
现在last
我们可以这样定义:
(define (last lst)
(foldl (lambda (e a) e) last lst))
它并不完美。如果您传递一个空列表,它应该发出错误信号,但是在ends-match?
中您检查了这一点,因此它不是问题。