поиск по вложенному списку в схеме, чтобы найти число - PullRequest
0 голосов
/ 25 февраля 2012

Как мне искать во вложенном списке, чтобы найти определенное число?

Например, список:

((1 2) (2 3) (3 4) (3 5) (4 5))

, а я ищу 1.

Ожидаемый результат:

(1 2)

, поскольку 1 находится в подсписке (1 2).

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Прежде всего создайте функцию, чтобы сгладить список. Примерно так:

> (flatten '((8) 4 ((7 4) 5) ((())) (((6))) 7 2 ()))
(8 4 7 4 5 6 7 2)

А затем найдите свой номер в обычном списке.

Этот вопрос выглядит как домашнее задание, поэтому постарайтесь разработать эту функцию самостоятельно, а если вы не можете это сделать - опубликуйте здесь свой код, и я постараюсь вам помочь.

Обновлено

Ok. Как я понимаю, нам нужно создать функцию, которая получает список пар и возвращает другой список пар, где первый элемент пары равен некоторому числу.

Например:

(define data '((1 2)(2 3)(3 4)(3 5)(4 5)))
(solution data 3)
-> '((3 4) (3 5))

(define data '((1 2)(2 3)(3 4)(3 5)(4 5)))
(solution data 1)
-> '((1 2))

Другими словами, нам нужно отфильтровать наш список пар по некоторому условию. В схеме есть функция для фильтрации списка . Требуется список для фильтрации и функция для принятия решения - включить или нет элемент списка в список результатов.

Итак, нам нужно создать такую ​​функцию:

(define (check-pair num p)
  (cond 
    [(= (first p) num) #t]
    [else #f]))

Эта функция получает пару (элемент списка), число и решает - включить или нет эту пару в список результатов. Эта функция имеет 2 параметра, но для функции фильтра требуется функция только с одним параметром, поэтому мы переписываем нашу функцию следующим образом:

(define (check-pair num)
  (lambda (p)
    (cond 
      [(= (first p) num) #t]
      [else #f])))

Я создал функцию, которая производит другую функцию. Это карри .

Итак, у нас есть все для создания нашего решения:

(define (check-pair num)
  (lambda (p)
    (cond 
      [(= (first p) num) #t]
      [else #f])))

(define (solution list num)
  (local 
    ((define check-pair-by-num (check-pair num)))
    (filter check-pair-by-num list)))

(define data '((1 2)(2 3)(3 4)(3 5)(4 5)))

(solution data 1)
0 голосов
/ 29 февраля 2012

Используйте find, чтобы выбрать члена списка, удовлетворяющего условию:

(find contains-1? '((1 2)(2 3)(3 4)(5 6)))

Как реализовать contains-1? Подсказка: рассмотрите функцию member:

(member 1 '(1 2)) => #t
(member 1 '(3 4)) => #f
0 голосов
/ 27 февраля 2012

Уплощение - это не тот подход, который я бы предпочел здесь, но это не значит, что он неправильный.Вот альтернатива:

    (define (solve lst num)
      (cond 
        [(null? lst) null]
        [(cons? (first lst)) (solve (first lst) num)]
        [(member num lst) (cons lst (solve (rest lst) num))]
        [#t (solve (rest lst) num)]))

Это просто рекурсивно обрабатывает вложенный листинг по мере необходимости, поэтому я предпочитаю его немного стилистически.Кроме того, вызов member можно заменить на check-pair сверху, но member позволит вам получать значения из cdrs, а также из автомобилей, если вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...