2014-05-15 1 views
0

코드 "tsFunc"는 두 개의 목록을 입력으로 가져오고 두 목록의 각 요소를 쌍으로 만듭니다. 대부분의 경우 작동합니다. 그런데 2 등 길이의리스트 (예 : '(1 2)'(3 4) .... 또는 '(abc)'(1 2 3) ....)를 주면 조금 이상한 행동을합니다. . 이상하게 작동 첫째, 현재 코드은 길이가 다른 두 입력 목록과 동작 길이가 다릅니다 (Scheme)

[문제 1]

(define (tsFunc lst1 lst2) 
(define (helper ls1 ls2 rst) 
    (reverse (if (or (null? ls1) (null? ls2))       
     rst             
     (helper (cdr ls1) (cdr ls2)    
       (cons (cons (car ls1) (car ls2)) rst))))) 
(helper lst1 lst2 '())) 

이 같은 행동 :. 목록의 고르지 않은 길이

1) 올바른 행동 : (tsFunc '(1 2 3) '(ab)) ====> 출력 : ((1. a) (2. b))

2)리스트가 짝수 인 경우의 이상한 동작 : (tsFunc '(1 2 3)'(a b c)) ===> output (wrong) : ((3. . c) (2 b) (1)) ===> 예상 :.... ((1) (2 b) (3 c))

두 입력 목록은 동일한 길이 인 경우에, 무슨 일 이니? tsFunc 논리가 길이가 다른 입력리스트와 길이가 다른 입력리스트 사이에서 다른 동작을합니까? (내가 아는 바로는, 코드는 최종 결과를 "반대로"해야하기 때문에 코드에서 "반전"때문이 아님)

[문제 2] tsFunc => tsFunc 결과 :. (1 ~ 2). (3 4) => 이와 같은 제품을 구현하기 위해 노력 (1 * 2) + (3 * 4) 14 = 그래서 이런있다 ..

(define (func l1 l2) 
(tsFunc (l1 l2)        ;; line 2 - how to call tsFunc's result?? 
    (foldl (lambda (acc pair)     ;; line 3 
     (+ acc (* (car pair) (cdr pair))))  ;; line 4 
    '() 
    l1 l2)))         ;; like this?? or ?? 

선로 (3) , 4 ok .. 그게 무엇을 해야할지에 대한 논리입니다. tsFunc 결과를 입력으로 사용하는 방법 ... 마지막 줄에 대한 두 개의 목록 .. 불명확 ..

+0

매번 거꾸로되는 것처럼 보입니다. 어큐뮬레이터를 반환 할 준비가되면 그냥 뒤집으십시오. – ggovan

답변

3

첫 번째 문제는 각 반복마다 목록, 정말로 반향이 필요한 경우 마지막에 한 번만 그것을 할, 출력을 SE는 : 두 번째 문제에 대한 지금

(define (tsFunc lst1 lst2) 
    (define (helper ls1 ls2 rst) 
    (if (or (null? ls1) (null? ls2)) 
     (reverse rst) 
     (helper (cdr ls1) (cdr ls2) 
       (cons (cons (car ls1) (car ls2)) rst)))) 
    (helper lst1 lst2 '())) 

- 코드도 컴파일되지 않습니다 : 올바르게 tsFunc 프로 시저를 호출하지 않는, 당신이 그것을 전화하는거야 잘못된 지점에. 여기 질문에 샘플 입력을 사용

(define (func l1 l2) 
    (foldl (lambda (acc pair) 
      (+ acc (* (car pair) (cdr pair)))) 
     0 
     (tsFunc l1 l2))) 

작동 할 방법은 다음과 같습니다 :

당신이 수를 반환하려는 경우 당신이 목록을 사용할 수 없습니다 - 또한 누적 매개 변수의 초기 값은 잘못 예상 한대로, 상기에서 tsFunc
(func '(1 3) '(2 4)) 
=> 14 

'((1 . 2) (3 . 4))하고 foldl 예비 동작 (1*2)+(3*4) = 14로 변환하는, 입력으로서 '(1 3)'(2 4) 걸린다.

+1

네, 맞습니다. 두 번째 문제는 "tsFunc"를 호출하는 방법에 대한 단서가 없었기 때문입니다.일단 당신의 제안 (글쎄, 아주 간단합니다)을보고, 이제는 "폴드"의 입력이 항상 끝에 있다는 것을 알게되었습니다 ... – user1915570

0

고차 함수를 사용할 수 있으므로 SRFI-1 List libraryfold 만 사용하면 되나요?

#!r6rs 

(import (rnrs base) 
     (only (srfi :1) fold)) ;; srfi-1 fold stop at the shortest list 

(define (func lst1 lst2) 
    (fold (lambda (x y acc) 
      (+ acc (* x y))) 
     0 
     lst1 
     lst2)) 


(func '(1 3) '(2 4 8)) ; ==> 14