2017-11-14 3 views
0

그래서 ID는 숫자 목록을 받아 원자화 (중첩 된 정수를 제거하기 위해) 한 다음 최대 값을 찾습니다. 나는 이것을 개별적으로 수행하는 두 개의 함수를 작성했지만 LISP에서 이들을 결합하는 방법을 알아낼 수 없으므로 한 번의 호출로 둘 다 실행할 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.LISP에서 두 함수를 결합하여 목록을 원자화 한 다음 최대 값을 찾으십니까?

:Atomize function to remove nests 
:(atomify ‘(a (b c) (e (f (g h) i)) j)->(a b c e f g h i j) 

(defun atomify (numbers) 
    (cond ((null numbers) nil) 
     ((atom (car numbers)) 
     (cons (car numbers) 
       (atomify (cdr numbers)))) 
     (t 
     (append (atomify (car numbers)) 
       (atomify (cdr numbers)))))) 



:Max value of a list of integers function 

(defun large_atom (numbers) 
    (if (null numbers) 
     0 
     (max (first numbers) 
      (large_atom (rest numbers))))) 
+0

나는 것 들여 쓰기와 더 나은 서식 지정을 통해 코드를 사람이 읽을 수있게 만들 것을 제안합니다. –

+0

함수가 이미 다른 함수를 결합합니다. 왜 atomify 및 large_atom에도 해당하지 않아야합니까? –

+0

형식에 대한 사과, lisp 형식 지정에 대한 올바른 방법 찾기 –

답변

2

제이미. 당신의 방법은 두 단계로 이루어져 있습니다 : 1. Flatten list 2. 1 단계의 결과에서 최대 값 찾기 이 경우는 사실입니다. 그러나 하나의 함수 호출로 수행해야합니다. 그것은 간단합니다. 그냥 labels, apply 물론 max

(defun foo (lst) 
    (labels ((flatten (lst acc) 
      (cond 
       ((null lst) 
       acc) 
       ((consp (car lst)) 
       (flatten (cdr lst) (flatten (car lst) acc))) 
       (t 
       (flatten (cdr lst) (cons (car lst) acc)))))) 
    (apply #'max (flatten lst nil)))) 

또 다른 방법을 사용하여 소스 목록을 평평하게하지 않는 것입니다. 그러나이 경우에는 다른 값과 비교할 첫 번째 값을 찾아야합니다. 직접 해보십시오.

+0

응답을 주셔서 감사 합니다만, 여기에 코드를 따르는 데 문제가 있습니다. 나는 그것을 실행하려고 할 때 foo가 아무런 가치가 없다고 알려줍니다. –

+0

args와 함께'foo'를 호출해야합니다. 예를 들어'(foo '(1 2 3 (3 4 (4 3) 2 3) ((2 3 2) 1)))'. –

+0

나는 그것을 시도했다. 그러나 내가 집에 돌아갈 때 그것을 다시 시험해 볼 것이다. 답변을 주셔서 다시 한 번 감사드립니다! –

2

다음은이 문제를 해결하는 또 다른 방법입니다. 목록을 병합하는 대신 재귀 적으로 보냅니다. 이것은리스트의 구조가 무엇인지에 대해 매우 명시 적이다 : 좋은리스트는 각 요소가 정수 또는 좋은리스트 인 널이 아닌 적절한리스트이다.

이 방법의 문제는 반드시 매우 큰 구조에 실패합니다 (그리고 꼬리 경우에도 재귀 CL은 꼬리 재귀 처리 할 것을 약속하지 않도록이 꼬리 재귀가없는 점이다.

(defun greatest-integer (good-list) 
    ;; a good list is one of: 
    ;; - a cons of a good list and either a good list or() 
    ;; - a cons of an integer and either a good list or() 
    ;; In particular it can't be() and it can't be an improper list 
    ;; 
    (destructuring-bind (a . b) good-list 
    ;; a can be an integer or a good list, b can be null or a good list 
    (etypecase b 
     (null 
     (etypecase a 
     (integer a) 
     (cons (greatest-integer a)))) 
     (cons 
     (max (etypecase a 
       (integer a) 
       (cons (greatest-integer a))) 
      (greatest-integer b))))))