2013-03-12 2 views
0

중첩 목록을 통해 재귀를 수행하는 방법은 무엇입니까?중첩 목록을 통한 재시작 LISP

예를 들어

는 주어진 : '((A 1 2) (B 3 4))

가 어떻게 각각의 중첩 된 하위 목록의 두 번째 요소에 2를 추가?

(defun get-p0 (points) 
    (loop for x from 0 to 
      (- (list-length points) 1) do 
       (+ 2 (cadr (nth x points))) 
    ) 
) 

(get-p0 '((A 1 2) (B 3 4)))이 NIL을 반환하는지 잘 모르겠습니다.

+1

몇 분을 투자하십시오 http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/ ([리스프 코드를 포맷하는 방법] 배울 수 Common/Strandh-Tutorial/indentation.html). – danlei

답변

3

나는 이런 식으로 뭔가 함께 갈 것 :

(loop for (letter x y) in '((A 1 2) (B 3 4)) 
    collect (list letter (+ 2 x) y)) 

이유는 : 그것은 짧은 그리고 당신은 측정하지 않는다 (왜 그렇게할까요?)

+0

같은 기능에서 두 목록의 값을 조작하고 싶다면 어떻게해야합니까? 예를 들어 x1을 x2에 추가하고 싶습니다. – Drew

+0

x1은 1이고 x2는 3이됩니다. – Drew

+0

예. 나를 위해 일한다! – Drew

0

'루프'로 쓰면 아무 것도 반환하지 않습니다. 따라서 NIL이 반환됩니다. 마찬가지로 귀하의 코드는 단순히 x를 반복하고 무언가를 계산합니다. 무언가는 어디에도 저장되지 않습니다.

원하는 결과를 얻으려면 어떻게해야합니까? 당신이 지점에서 각 지점을 수정하고자하는 가정이 작동합니다 :

(defun get-p0 (points) 
    (loop for x from 0 to (- (list-length points) 1) do 
    (let ((point (nth x points))) 
     (setf (cadr point) (+ 2 (cadr point))))) 
    points) 
+0

초기 목록을 수정하기 때문에이 작업은 파괴적인 작업입니다. – uselpa

+0

예, 답변에서 언급했습니다. – GoZoner

1

당신이 넣는 방식은 문제를 기본 재귀 패턴으로 생각할 수 있습니다 : 재귀 또는 반복 (mapcar)을 사용하여 목록을 살펴 봅니다. , reduce 등; dolist, loop 등)을 작성하고 항목에 기능을 적용하십시오. 보조 기능으로 정의 할 수 있습니다

(defun get-p0 (points) 
    (mapcar #'add-2 points)) 

은 다음과 같습니다 : 여기에 기능적인 솔루션입니다

(defun add-2 (lst) 
    "Add 2 to the 2nd item" 
    (let ((res '())) 
    (do ((l lst (cdr l)) 
     (i 1 (1+ i))) 
     ((null l) (nreverse res)) 
     (push (if (= 2 i) 
       (+ 2 (car l)) 
       (car l)) 
      res)))) 
2

재귀 솔루션을을 요구하기 때문에 :

(defun get-p0 (lst &optional (n 0)) 
    (if (null lst) 
     nil 
     (let ((elt1 (first lst)) (eltn (cdr lst))) 
     (if (listp elt1) 
      (cons (get-p0 elt1) (get-p0 eltn)) 
      (cons (if (= n 1) (+ elt1 2) elt1) (get-p0 eltn (+ n 1))))))) 

그래서

? (get-p0 '((A 1 2) (B 3 4))) 
((A 3 2) (B 5 4)) 

및 rec urses 더 필요한 경우 아래 :

? (get-p0 '((A 0 2) ((B -4 4) (C 10 4)))) 
((A 2 2) ((B -2 4) (C 12 4)))