게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

숙제 1 관련 질문입니다

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
임성철



가입: 2012년 9월 8일
올린 글: 35

올리기올려짐: 2012년9월8일 15:38    주제: 숙제 1 관련 질문입니다 인용과 함께 답변

2번 과제 (튜링2) 를 수행하는 중에 궁금한 점이 있어서 질문드립니다.

1.

튜링2는 리스트를 리턴할 것을 요구하고 있습니다.
그런데 리턴할 리스트를 먼저 선언해야 할 것으로 생각하는데,

(define (t2 n)
(define foo ())
...

foo)

이런 방식으로 함수 안에 foo라는 리스트를 만들어서,
그 안에 출력할 값을 차례로 집어넣고,
foo를 리턴할 수는 없을 것 같습니다.
이는 (t2 n)이라는 함수가 재귀적으로 사용될 것이기 때문으로 추측합니다.
(꾸준히 foo는 ()로 다시 define될 것입니다..)

(define foo ())

(define (t2 n) ... )

이렇게 함수의 밖에 리스트를 만들어 사용하는 것도
문제의 의도에 어긋날 것으로 보입니다.

리스트를 선언하는 위치가 어디가 되어야 할지 잘 모르겠어서 질문드립니다.

* display "0", display "1"을 사용해서 (t2 n)의 결과를 출력할 수는 있습니다.

2.

foo라는 리스트를 만든 후 foo에 차례로 값을 채우고,
foo를 리턴하기 위해서는

(define foo (cons value foo)) 와 같은 방식으로
꾸준히 foo가 새롭게 정의되어야 할 것으로 생각합니다.

하지만 이런 instruction은 drScheme의 아래쪽 코드창에서는
오류 없이 수행되지만,

ex)

> (define foo ())
> foo
()
> (define foo (cons 1 foo))
> foo
(1)
> (define foo (cons 2 foo))
> foo
(2 1)
>

위쪽 코드창에서는 오류가 발생합니다.

ex)

(define foo (cons 0 foo))

define: not allowed in an expression context in: (define foo (cons 0 foo))

이런 이유가 궁금합니다.
위로
사용자 정보 보기 비밀 메시지 보내기
강동옥



가입: 2009년 9월 18일
올린 글: 602

올리기올려짐: 2012년9월8일 23:27    주제: 인용과 함께 답변

1.

(define foo ())

(define (t2 n) ... )

파일 안에 define이 여러개 있어도 상관 없습니다. t2만 잘 실행되면 됩니다.

2.
(define foo ())
(define foo (cons 1 foo))
(define foo (cons 2 foo))
위쪽 코드 창에 입력해도 에러가 나지 않습니다.

에러가 나는 코드를 구체적으로 적어주실 수 있나요?
위로
사용자 정보 보기 비밀 메시지 보내기
임성철



가입: 2012년 9월 8일
올린 글: 35

올리기올려짐: 2012년9월9일 13:43    주제: 인용과 함께 답변

답변 감사합니다 ^^

//

> (define goo ())
> goo
()
> (define goo (append goo '(0)))
> goo
(0)
> (define goo (append goo '(1)))
> goo
(0 1)
>

이런 방식으로 리스트의 뒤에 새로운 값을 넣으려고 합니다.

코드는 아래에 첨부합니다.

(define foo ())

(define (t2 n)
(if (...)
(t2 (...))
(if (....)
(t2 (....))))
(define foo (append foo '(0)))
(let loop ((....))
(if (....)
(define foo (append foo '(1)))
(if (....)
(define foo (append foo '(1)))))
(if (....)
(loop (....))
(if (....)
(loop (....)))))
foo)

이 코드를 Run할 시 이런 메시지를 만나게 됩니다.

define: not allowed in an expression context in: (define foo (append foo (quote (0))))



그리고 혹시...
if 조건문이 참일 경우 여러 instruction을 수행하게 할 수는 없나요?

예를 들어서, C언어의 경우
if (i = 1) {
printf("0");
printf("1");
i++;
}

이런 식으로 여러 instruction을 수행할 수 있어요.
위로
사용자 정보 보기 비밀 메시지 보내기
최민아



가입: 2009년 9월 28일
올린 글: 236

올리기올려짐: 2012년9월9일 14:47    주제: 인용과 함께 답변

1. 위에 (define foo ()) 를 해 줬더라도

아래에서 foo를 새로 define하고 있으므로

(define foo (append foo '(0)))의 foo는 이 줄에서 정의한 foo를 가리킵니다. 따라서 foo가 제대로 정의될 수 없습니다.

위에서 정의한 foo에 0을 붙이고 싶으면 define을 새로 쓰지 말고 (append foo '(0))의 식으로 사용하시면 됩니다.

그리고 empty list는 따로 정의할 필요 없이 그냥 ()로 사용하시면 됩니다.


참고로, 이번 숙제는 재귀적으로 문제를 해결하는 것에 익숙해지는 것이 목적으로, 재귀호출을 활용한다면 리스트를 반환하기 위해 따로 리스트에 이름을 붙일 필요는 없습니다.


2. (begin e1 e2 e3 ...)를 사용하시면 됩니다.

힌트를 드리자면, 이 역시 재귀호출을 사용한다면 쓸 필요가 없습니다.

t2 n을 n보다 더 작은 입력에 대한 t2 값으로 정의해 보세요.
위로
사용자 정보 보기 비밀 메시지 보내기
임성철



가입: 2012년 9월 8일
올린 글: 35

올리기올려짐: 2012년9월9일 21:16    주제: 인용과 함께 답변

답변 감사합니다.

//

1. 이미 가지고 있는 foo라는 리스트의 마지막에 '(0)을 추가하는 게 목적인데,
그냥 append foo '(0)만 하면 foo의 마지막에 '(0)이 붙는 게 아니라
foo 와 '(0)을 append한 (foo 0) 이런 리스트를 새롭게 리턴하는 것뿐인 거 같아요.
foo의 값은 변하지 않는 것으로 보입니다.

ex)

> foo
()
> (append foo '(0))
(0)
> foo
()
>


2.

그리고, 재귀적으로 문제를 해결하기 위해

(define (t2 n)
(if (> n 0)
(t2 (- n 1))
(if (< n 0)
(t2 (+ n 1))))
// 이후는 리스트에 0, 1을 붙여나가는 과정

이런 방식으로 코드를 재귀적으로 호출하고 있습니다.

리스트를 반환하기 위해 리스트에 이름 붙일 필요가 없다고 하셨는데..
그럼 혹시 기본적으로 제공되는 리스트가 있나요?
리스트를 선언하지 않고 리턴할 수 있는 방법이... 있나요?
위로
사용자 정보 보기 비밀 메시지 보내기
최민아



가입: 2009년 9월 28일
올린 글: 236

올리기올려짐: 2012년9월10일 10:10    주제: 인용과 함께 답변

1.
맞습니다. foo는 변하지 않고, (append foo '(0)) 자체가 foo에 0을 붙인 리스트를 나타냅니다.

2.
base case를 정의하고 재귀호출을 사용하면 (t2 n) 이외의 이름을 붙이지 않아도 된다는 뜻이었는데, 이름을 붙여 구현하고 싶으시면 그렇게 하셔도 됩니다. 테스트 케이스에 대해 잘 돌아가면 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기
최민아



가입: 2009년 9월 28일
올린 글: 236

올리기올려짐: 2012년9월10일 12:52    주제: 인용과 함께 답변

안녕하세요. 프로그래밍의 원리 조교 최민아입니다.

위의 답변을 정정합니다. 죄송합니다.

define: not allowed in an expression context 에러가 나는 이유는 함수 정의에서 definition들은 윗부분에 있어야 하기 때문입니다.
에러를 해결하려면 define문을 위로 옮겨야 할 것 같습니다.

또 궁금한 점이 생기면 언제든지 게시판에 질문해 주세요.
위로
사용자 정보 보기 비밀 메시지 보내기
임성철



가입: 2012년 9월 8일
올린 글: 35

올리기올려짐: 2012년9월10일 21:04    주제: 인용과 함께 답변

1.

그러면, 한 번 define된 foo에 새로운 element를 추가하는 등,
foo 의 값을 바꿔줄 수 없다는 뜻인가요?


2.

1번 문제인 my_gcd 의 경우 리스트를 리턴하는 문제가 아니기 때문에

(if ( base case ) 1)

이런 식으로 base case의 값을 바로 리턴하면 됐었는데요,

2번 문제의 경우 리스트를 사용해서 리턴하므로...

1번 문제와 같은 방법을 사용하기 힘들 거 같아요.


혹시 (t2 n) 자체가 이미 하나의 리스트를 나타내거나.. 그런가요?
위로
사용자 정보 보기 비밀 메시지 보내기
최민아



가입: 2009년 9월 28일
올린 글: 236

올리기올려짐: 2012년9월10일 22:10    주제: 인용과 함께 답변

1.
(define foo ..)
(define foo ..)의 식으로 바꿔줄 수는 있겠지만, 의미가 없겠지요.

scheme 같이 값 중심의 함수형 프로그래밍 언어로 프로그래밍하는 것은 C 등의 절차형 언어와 방식이 다소 다릅니다.
define은 C에서 a=7과 같은 assign의 의미와 완전히 같지 않습니다. 이러한 assign은 a가 특정한 메모리 위치를 가리키고, 이 위치에 7을 써 넣는다는 의미입니다. 따라서 이후 a=5라고 쓰면 a가 나타내는 위치에 5를 써 넣는다는 의미입니다. 실제로 assign을 하는 것이 코드의 주를 이루고요.
(define a 7)은 말 그대로 7이라는 어떤 값에다 a라는 별칭을 붙여주는 것입니다. 물론 이후에 다시 define을 써서 다른 값에 a라는 이름을 붙이면 최근 값이 a라는 이름을 갖게 되지만, 보통 이런 식으로 사용하지 않습니다. 보통은 define을 한번만 쓰고, 이미 정의해 놓은 값들을 이용해 다시 다른 값들을 정의하는 것이 코드의 주된 부분입니다. 코딩하다가 어떤 값이 필요하면, 그 값을 함수 밖에 혹은 함수의 맨 위에 정의해 놓고 사용하면 됩니다.
또한 loop보다는 재귀호출이 더 자연스럽다는 것도 절차형 언어와 다른 점입니다.

2.
네. (t2 n)은 정수를 받아 리스트를 내놓는 함수이기 때문에 (t2 2), (t2 4) 등은 리스트입니다. (define (t2 n) 어떤 리스트)로 정의해 주세요. 1번 문제를 푸신 것과 비슷한 방법으로 푼다고 생각하시면 될 것 같습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
임성철



가입: 2012년 9월 8일
올린 글: 35

올리기올려짐: 2012년9월11일 13:10    주제: 인용과 함께 답변

고맙습니다 ^^

이제 조금 알 거 같아요


이제 여러 개의 재귀적인 함수로 문제를 해결하고 있는데

ex>

(define (a n i)
)

(define (comb n i)
)


(define (yanghui n)
)

2번 문제나 3번 문제 등,

웬만한 문제는 하나의 함수(yanghui n)만으로도 해결 가능한가요?
위로
사용자 정보 보기 비밀 메시지 보내기
최민아



가입: 2009년 9월 28일
올린 글: 236

올리기올려짐: 2012년9월11일 15:15    주제: 인용과 함께 답변

구현하기에 따라 다를 것 같습니다.

yanghui 함수가 잘 작동하기만 하면 다른 함수는 원하는대로 정의해서 쓰셔도 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay