2017-09-26 74 views
0

我试图创建函数,检查列表是否正确或不正确。在互联网上找不到任何解决方案。这可能吗?方案中可以检查列表是否正确或不正确?

例如我们的代码中使用list?

(define (proper-list? list) 
    (cond 
    ((list? list) '(it's a proper list)) 
    (else '(it's an improper list)))) 

(proper-list? '(a b c)) 
; -> (it's a proper list) - OK 
(proper-list? '(a b . c)) 
; -> (it's an improper list) - OK 
(proper-list? '(a . b)) 
; -> (it's an improper list) 
; - NOT OK. it should return (it's a pair) 

如何从对区分不当列表?

+0

嘿!欢迎来到Stack Overflow。你的问题在细节上略显吝啬。如果我们有一个很好的示例,我们可以帮助您更高效地工作。 https://stackoverflow.com/help/mcve –

+1

'list?'的一些提示可以做到这一点。它迭代每一对来检查最后一个'cdr'是否是'()'使它成为O(n)。在非Scheme语言'#lang racket'我认为'list?'是O(1).. – Sylwester

+1

即使输入列表恰好是循环的,函数是否必须终止?你认为这个清单是否正确? – Kaz

回答

0

功能list?检查羯羊列表是正确与否:

(list? '(1 2 3)) ; ==> #t 
(list? '(1 2 . 3)) ; ==> #f 

使用此在您的函数返回要么两个列表中的规范。

编辑

因为这(a . b)不会被认为是不正确的名单我想你应该在你cond添加一个额外的术语,区分在链和一对以上的两个不当列出了奇怪的规定的通过在cdr中使用pair?来链中的一对。 (pair? (cdr '(a . b)) ; ==> #f(pair? (cdr '(a b . c)) ; ==> #t

+0

'(list?'(1。2)); ==>#f'。我需要区分不合适的列表。 –

+0

@MaxVishnevsky完全不疯狂('''''b)'一个不正确的列表,但'(缺点'(缺点'c))'一个,但我已经添加了一个提示 – Sylwester

+0

非常感谢!我找到解决方案你的帮助!:) –