Scheme中嵌套列表的成员函数

时间:2016-09-25 04:15:53

标签: recursion scheme racket

有人能告诉我这段代码中的错误吗? 我想概括成员函数以支持嵌套列表。我需要在嵌套列表中搜索内容,并在找到内容时返回列表的其余部分。我真的不明白下面的代码有什么问题。

(define (memberk thing lis)              
  (cond
    ((null? lis) #f)
    ((list? (car lis))
     (cons (memberk thing (car lis))
           (memberk thing (cdr lis))))
    (else
     (if (equal? (car lis) thing)
         lis
         (memberk thing (cdr lis))))))

Expexted输出:(memberk 3 '(1 4 (3 1) 2)) = '((3 1) 2)
上述代码的实际输出:'((3 1) . #f)

2 个答案:

答案 0 :(得分:1)

所以我怎么看这个你想要在car中找到密钥的顶级缺点。我想的是:

(define (memberk needle lst)
  (define (found? haystack)
    (or (equal? needle haystack)
        (and (pair? haystack)
             (or (found? (car haystack))
                 (found? (cdr haystack))))))
  (let loop ((lst lst))
    (cond ((null? lst) #f)
          ((found? (car lst)) lst)
          (else (loop (cdr lst))))))

(memberk '(a) '(a b (b (a) c) c d)) ; ==> ((b (a) c) c d)

答案 1 :(得分:0)

这样的东西?

有点不清楚你想要什么 - 因为只有一个测试用例。

function map_path($path,$arr)
{
  if (($path=='')||(isEmpty($arr)))
    return array();
  $start=strpos($path,'.');
  if ($start>=0)
  {
   $prefix=substr($path,0,$start);
   $suffix=substr($path,$start+1);
   return array_map(function ($a) {return array(
       $prefix => map_path($suffix,$a))
    );},$arr);
  }
  else
    return array($path => $array[$path]);
}