2012-03-08 2 views
1

헤즈, 나는 (링크를 참조하십시오) 다음을 수행하는 프로그램을 만들 수 있습니다 리스프 동전 던지기가 리스프에서 순서

http://uva.onlinejudge.org/external/103/10328.html

내가 나무

(defun head-tail (n &optional (total 0)) 
    (if (< total n) 
     (list(cons 'H (head-tail n (1+ total))) 
      (cons 'T (head-tail n (1+ total)))) 
    nil)) 

를 만드는 코드를 H = 헤드들의 시퀀스를 검사하도록 코드화한다.

(defun head-search2 (tree n &optional (total 0) (check 0)) 
    (cond ((null tree) 
     check) 
     ((listp (first tree)) 
     (+ (head-search2 (first tree) n total) 
      (head-search2 (rest tree) n total check))) 
     ((and (eq (first tree) 'H) 
       (>= (1+ total) n)) 
     (head-search2 (rest tree) n (1+ total) 1)) 
     ((and (eq (first tree) 'H) 
       (< (1+ total) n)) 
     (head-search2 (rest tree) n (1+ total) check)) 
     ((eq (first tree) 'T) 
     (head-search2 (rest tree) n 0 check)))) 

및 마지막 함수 t o 그 두 가지를 합치십시오.

(defun head-check (m n) 
    (head-search2(head-tail m) n)) 

코드가 많은 수의 나무와 함께 작동하지 않으면 어떤 도움이 될 수 있습니다!

+0

"많은 수의 나무와 관련이 없다"는 것은 무엇을 의미합니까? – zmccord

+0

내가 3의 트리에 대해 2를 찾는 경우에 올바른 결과를 가지지 만 트리 = 4와 시퀀스 = 2에 대해서는 출력이 8이고 트리가 6 일 때 출력이 7이된다. n = 2는 31을 준다. @ zmccord – Drakoumel

+0

당신이 가리키는 웹 페이지가 무엇인가를 명확하게하지 않습니다. 실제로 동전 던지기 실험을하지는 않습니다 (의사 난수 생성기와 같음). 여러분은 머리와 꼬리의 모든'(expt 2 n)'의 가능한 조합을 처리하고 H의 시퀀스를 찾고 있습니다. 이것은 순전히 조합적인 문제입니다 : 0 ~ 2 N의 많은 N 비트 이진수는 적어도 K 제로 비트의 연속적인 시퀀스. 권리? – Kaz

답변

1

이 두 가지 문제가 있습니다 : 함수 head-search2에서

  1. , cond의 두 번째 절 head-search2에 처음 재귀 호출은 check 아래로 전파되지 않습니다.

  2. 동일한 절에서 두 번째 재귀 호출은 첫 번째 매개 변수로 (rest tree)을 가져 오며, 결과적으로 추가 레이어가 생성됩니다. 대신 (second tree)이어야합니다.

즉, 트리를 두 번 통과합니다. 먼저 구성한 다음 계산합니다. 조금 더 신중하게 생각으로, 당신은 명시 적으로 구축하지 않고, 단지 한 번을 가로 지르는 많은 작업을 저장할 수 있습니다

(defun count-n-runs (m n &optional (k n)) 
    "Count all possible binary sequences with n consecutive 1s." 
    (cond ((= 0 n) (expt 2 m)) 
     ((= 0 m) 0) 
     ((+ (count-n-runs (1- m) k k) 
      (count-n-runs (1- m) (1- n) k))))) 

독자들에게 연습 문제로 남겨 동적 프로그래밍이 더 재 작성. ;)

+0

아, 한번 많이 보아 주셔서 감사합니다. D @huaiyuan – Drakoumel