2010-01-05 5 views
0

목록 언어의 요소 수를 계산하는 함수를 작성해야합니다. 예를 들어목록에 얼마나 많은 요소가 스키마로 구성되어 있습니까?

(howMany 'a) 0을 반환
(howMany '(a b)) 반환 한
(howMany '(a (b c))) 수익률이

내가 어떻게 할 수 있습니까? 나는 작업 코드를 원하지 않았다. 단지 그렇게할만한 아이디어였다. 어쩌면 작업 코드를 제거하는 것을 고려해야합니다. :) 고마워요

+1

(a ((b) c) d)가 유효하고, 그렇다면 어떻게 호출해야합니까? – Brian

+0

예, 유효하며 3을 반환합니다. –

+0

이전 테스트 케이스가 너무 모호했습니다. 입력의 길이 또는 가장 깊은 중첩 수준을 원하십니까? – Brian

답변

3

접기 답변이 효과적입니다. 그러나 숙제 인 경우 간단한 내장 함수 만 사용하여이 작업을 수행하려고 할 수 있습니다. 가능한 답은 두 가지입니다.

여기에 순 방법 : (. 스킴의 구현 함수 대신 null?empty?를 가질 수있다)

(define (howMany list) 
    (if (null? list) 
     0 
     (+ 1 (howMany (cdr list))) 
) 
) 

그러나,이 알고리즘은 다수 선형 비례 공간의 양 걸릴 어떤 추가를하기 전에 목록의 각 요소에 대해 (+ 1 ...)을 저장할 것이기 때문에 목록에있는 요소 중 하나를 선택해야합니다. 직관적으로, 당신은 이것을 필요로하지 않아야합니다.

(define (howMany list) 
    (define (iter numSoFar restOfList) 
     (if (null? restOfList) 
      numSoFar 
      (iter (+ numSoFar 1) (cdr restOfList)) 
    ) 
    ) 
    (iter 0 list) 
) 

(보너스 포인트 :.. 당신은 단지 몇 계획의 기본 요소를 알고있는 경우가 더 분명하기 때문에 간결이 더 쓸 계획의 (let iter ...) 구문을 사용 나는이 스타일을 사용)

여기에 그 문제를 피할 수 더 나은 알고리즘입니다
+0

일반적으로 숙제에서 작업 코드를 제공하는 것은 누군가를 가르치는 좋은 방법이 아닙니다. 선생님은 학생이 그것을 임의적 인 사람이 아니라 해결하기를 원했습니다. 그래도 도와주고 싶었 단다. – LiraNuna

+0

이 코드는 list가 목록이 아니므로 첫 번째 테스트 케이스에서 실패합니다. – Brian

+0

@LiraNuna : 좋은 지적입니다. 고마워요. 다음 번에 더 잘 할려고 노력할 것입니다. –

2

이것은이 구문에 대해 가장 낮은 투표를 거치지 만 체계는 모르겠습니다. 그러나 나는 함수형 프로그래밍에 익숙하다.

내장 기능이 없으면 시작 값 0으로 목록을 '접기'부터 시작하고 추가로 접을 때마다 1을 더합니다.

+0

scheme에는'foldr'과'foldl' 함수가 있습니다. +1 –

+0

@aforloney : 실제로'fold-left'와'fold-right'입니다. –

+0

방향은 중요하지 않습니다. – LiraNuna

1

이것은 단순히 목록의 요소 수를 세고 있습니다.

+1

'(not (pair? list))'를 테스트하여 처음 두 개의'cond' 라인을 여기에 결합 할 수 있습니다. – acfoltzer

관련 문제