2009-09-29 2 views
5

의 마지막 요소는 우리가 내가 목록 I 출력이 (5 F j를 5)과 같을 것이다 방식으로 각리스트의 마지막 요소를 얻을 수있는 방법 ((3 4 5) (d e f) (h i j) (5 5 5 5))각 목록

있다고 가정 해 봅시다하기?

+4

은 숙제처럼 보입니다. – nothrow

답변

0

목록의 마지막 요소를 반환하는 절차를 작성한 다음 내장형 MAP (a.k.a. MAPCAR) 절차에 대해 조금 배우고 전구가 꺼져 있는지 확인하십시오.

+1

common-lisp에서 내장 함수 LAST와 MAPCAN은 다소 유용 할 수 있습니다. –

9

이것이 Common Lisp에 관한 것이라고 가정하면, 목록의 마지막 항목을 포함하는 목록을 반환하는 함수 last이 있습니다. mapcan과 함께이 함수를 사용하면 목록의 각 요소에 특정 함수를 적용하고 연결된 결과를 반환하므로 원하는 결과를 얻을 수 있습니다.

목록의 마지막 요소에 액세스하는 것은 O(N) 작업이므로 결국 숙제가 아니라면 마지막 문제를 해결하는 것보다 실제 문제를 더 효율적으로 해결할 수 없는지 고려해보십시오 (아마도 다른 데이터 구조를 대신 사용할 수도 있습니다).

+0

그 해답을 보내 주셔서 감사합니다. 그러나 그것에 대해 더 많은 정보를 제공해 주실 수 있습니까? MAPCAR의 사용법과 같습니다. 미안하지만 물어 줘서 고마워. Lisp을 개발하는 데있어 나의 우스꽝스런 attemp가 너에게 이걸 좀 더 도와 줄 수 있기를 바란다. 사전에 고마워 .btw, 메신저로 공통 리스프를 사용하고 미안해. –

+0

언급 한 기능에 대한 설명서 링크를 추가했습니다. 여기에는 예제가 포함되어 있습니다. – sepp2k

+0

안녕하세요! 나는 주든지 길을 내 코드 (defun는의 lastelements (L) \t (L 경우 일부 방법 하나를 작업을 할 수 있었다 \t \t (추가 (마지막 (첫 번째 L)) (lastelements (휴식 L))) \t 하지만 작은 문제가 있습니다. 입력 할 때 '((4) (hello (world)))는이 ((4) ((world))와 유사하지만 예제에서 나온 것입니다. 출력은 우리의 운동에 다음과 같이 보일 것입니다 (4 (세계)) .. 미리 감사드립니다! –

3

대부분의 초기 LISPy 숙제 문제와 마찬가지로 생각을 재귀 적으로 그리고/또는 유도 측면에서 생각하는 연습입니다. 시작하는 방법은 쉽게 대답 할 수있는 간단한 질문을하는 것입니다. 예를 들어

, 각 목록에 당신에게 첫 번째 요소를 준 뭔가를 작성하는 요청 된 경우, 나는 것이 방법에 관한 일 :

이 목록의 목록을 감안할 때 :

  1. 무엇 목록의 모든 목록의 첫 번째 요소입니다. '()? (쉬운 - null)
  2. 목록에있는 모든 목록의 첫 번째 요소는 무엇입니까 '(a)? (쉬운 - a, 또는 아마도 오류)
  3. 목록의 모든 목록의 첫 번째 요소는 무엇입니까 '((a))? (쉬운 - (a))
  4. '(anything) 형식의 목록 중 첫 번째 요소는 무엇입니까? (쉬운 - (first anything))
  5. '(anything morestuff) 양식의 모든 목록의 첫 번째 요소는 무엇입니까? (쉬운 - (cons (first anything) (first-element morestuff)))
  6. 원자의 처음은 무엇입니까? 원자 또는 오류 (사용자의 관점에 따라 다름)
  7. 첫 번째 null입니까? nil.
  8. 첫 번째 목록은 무엇입니까? (car list)

여기에서 우리는 코드를 작성 시작할 수 있습니다

;; here's first, meeting questions 6-8 
(define first (lambda (l) 
    (cond 
    ((null? l) nil) ; Q7 
    ((atom? l) l) ; Q6 
    (t (car l))))) ; Q8 

;; with first we can write first-element, meeting questions 1-5 
(define first-element (lambda (l) 
    (cond 
    ((null? l) nil) ; Q1 
    ((atom? l) (first l)) ; Q2 
    (t (cons (first (car l) (first-element (cdr l)))))))) ; Q4-5 

지금이 당신의 숙제 (의도적으로) 아니다. 이걸 가지고 놀고 어떻게 작동하는지 이해해야합니다. 당신의 다음 목표는 이것이 당신의 임무와 어떻게 다른지와 거기에 도착하는 방법을 찾아야합니다.

MAPCAR와 관련하여? 그것에 대해 걱정하지 마십시오. 재귀 적 문제를 먼저 푸는 방법을 배워야합니다. 그렇다면 MAPCAR에 대해 걱정할 수 있습니다. 이 임무의 요점은 무엇입니까? 이 모드에서 사고하는 법을 배울 수 있습니다.Dou 근처 LISP/Scheme의은 이런 식으로 생각합니다.

내가 걱정하고있는 부분으로 모든 질문을 다뤘던 이유. "목록의 모든 항목에 대해 어떻게해야합니까?"라는 작업이 주어진다면 질문에 대답해야합니다 : null 처리는 어떻게합니까? 어떻게 원자를 다루는가? 목록의 첫 번째 요소를 처리하려면 어떻게해야합니까? 어떻게해야합니까? 일단 내가 대답했다면, 나는 foo를 실제로 어떻게 수행하는지 알아 낸다. null에서 foo는 어떻게합니까? 어떻게하면 원자에 foo를 할 수 있습니까? 목록에서 foo를 어떻게 수행합니까?

0

아마 이미 해결된다,하지만 난 생각이 밖으로

; SELECT-FROM-INNER-LIST :: [list] -> [list] 
(DEFUN SFIL (lst) 
    (COND ((NULL lst) NIL) 
     ((LISTP (FIRST lst)) (APPEND (LAST (FIRST lst)) (SFIL (REST lst)))) 
)) 

, 그것은하지 않습니다 경우 .... 올바른 목록 기능 SFIL를 호출 할 경우 그래서 지금,이 ... 합법적 목록 작동 혀짤배기의 초보자로에게

+0

몇 가지 의견 : 첫째, 원칙적으로, [별도의 줄에 닫는 괄호를 두지 마십시오] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Tutorial/indentation.html); 폼의 들여 쓰기 레벨은 코드의 구조를보기에 충분하며 어쨌든 편집기는 사용자를 위해 괄호의 균형을 유지해야합니다. 둘째, 코드는 일반적으로 소문자로 작성됩니다. 통역관이 너에게 소리 치지 만, 너는 똑같이 할 필요가 없다. 마지막으로, 당신의 타입 시그니처는 SELECT-FROM-INNER-LIST :: [[a]] -> [a]'이어야한다고 생각합니다; 반환 값은 * 반드시 * 목록의 목록이되지는 않습니다. – Inaimathi

0
(defun get-last-lists (s) 
    (setq rt 'nil) 
    (loop for i from 0 to (- (length s) 1) 
     do (setq rt (append rt (last (nth i s))))) 
    (print rt)) 

을 찾아 누군가를 위해,

NIL

는 희망이 도움이 될 것입니다 반환, 난 내 솔루션을 게시 할 수 있습니다.

+1

나는 당신의 대답을 좀 더 넓힐 것이다. – ObieMD5

+0

나는 당신의 개선 또는 다른 것을보고 싶습니다. :) –

+0

부작용없이이 작업을 수행하고 인쇄하는 것보다는 실제로 결과를 반환합니다. '와 같은 것 (defun last (list-of-lists) (리스트의 목록에있는 l에 대한 루프 (마지막 l)))' – Inaimathi