- 질문 게시판입니다.
Date 17/09/25 18:02:30
Name   二ッキョウ니쿄
Subject   프로그래밍 질문입니다
package com.tj.method;
import java.util.Scanner;
// 4! = 4*3*2*1
// 사용자로부터 자연수를 입력받아(음수를 입력시 계속 자연수입력받을때까지)
//x의 factorial을 계산하여 출력
// factorial(int x) : x!를 보내주는 메소드
public class Ex04 {
public static void main(String[] args) {
//사용자로부터 자연수입력받아
// factorial(x)를 출력
int x=0;
Scanner sc= new Scanner(System.in);
do{
System.out.print("자연수를 입력하세요 : ");
x = sc.nextInt();
}while(x<=0);
System.out.println(x+"! = "+factorial(x));
}
private static int factorial(int x) {
//3! = 3*2!(2*1!(1))
//x! = x*(x-1)!
if(x==1) {
return 1;
}else {
return x * factorial(x-1); //재귀적 호출
}
/*int result=1;
for(int i=x; i>=1; i--) {
result = result * i;//4*3*2*1, result*=i
}
return result;*/
}
}


안녕하세요
자바교육 6일차 쪼렙 교육생입니다
궁금한 점은 private static int factorial(int x) 요 부분인데요
if문에서 returnX*factorial(x-1)이 왜 반복되는지 잘 모르겠습니다. for문은 반복기능이 있으니까 이해가 되는데
반복기능 없이도 반복이 되서 팩토리얼 계산이 되더라고요. 처음에는 factorial 이라는 표현 자체가 반복의 의미가 있는건가 했는데 그런얘기도 못들어서요
쪼렙 교육생에게 설명해주시면 감사드리겠습니다 ㅠㅠ



0


반짝반짝
장난감 중에..이름이 뭐였는지 기억은 안나지만.
큰박스안에 조금 작은박스가 있고 그 작은 박스를 열면 또 그거보다 작은 박스가 있는..
그래서 결국엔 끝이 나지만 엄청 작아질 때까지 줄어드는 것과 같은 방식으로.

리턴 4 * factorial(3)
3 * factorial(2)
이런식인거져
二ッキョウ니쿄
그 러시아 장난감 생각나네용 ㅎㅎ감사합니다
바닷내음
recursion 때문인데요.
처음에 factorial(a) 를 부르면
return 되는 값은 a * factorial(a-1) 가 되는데 여기서 factorial이라는 함수는 자기 자신입니다. 함수 내에서 자기 자신을 또 부르는거에요. 여기서 factorical(a-1)까지 풀어서 쓰면
a * (a-1) * factorial(a-2) 가 되죠
a * (a-1) * (a-2) * .... 되는데 factorial(x)의 x가 결국 1이 될 때까지는 계속 현재값 * factorial(현재값-1) 를 return합니다.
마지막에 결국 1을 리턴함으로써 종결되는거죠.
이걸 recursion이라고 합니다. 자기 자신, 여기서는 factorial(x)라는 함수를 부른다는 뜻이에요.
二ッキョウ니쿄
recursion 속성이 그럼 factorial 이라는 함수가 갖는 특성때문인가요? 자기 자신을 또 부르는(재귀)과정에서 그렇게 되는건지... a*factorial(a-1)*factorial(a-2)... 이런식으로 1이 될때까지 반복하는 속성이 생기는거라고 생각하면 될까요? 사용한건 if뿐인데 이런답이나와서 어디서 그런 특성이 생긴건지 모르겠더라구요
April_fool
[return x * factorial(x-1); //재귀적 호출]
요 부분이 핵심인 겁니다.
바닷내음
factorial 자신이 자기자신 안쪽에서 factorial을 불러서 그런겁니다.
factorial 안쪽에서 if 로 behavior를 갈라놓았죠.
만약 if (x==1)이라는 구절이 없으면 평생 자기 자신보다 하나 적은 변수를 대입해서 자기자신을 부를겁니다. 컴퓨터가 답을 내놓지 못할거에요. 계속 실행을 하면서..
혹은 처음에 들어온 값이 0이거나 음수라도 똑같이 평생 자기자신 부르겠네요. 아무리 1씩 빼면서 다음 숫자를 보아도 1이 나올일이 없으니까요.

private static int factorial(int x) ... 더 보기
factorial 자신이 자기자신 안쪽에서 factorial을 불러서 그런겁니다.
factorial 안쪽에서 if 로 behavior를 갈라놓았죠.
만약 if (x==1)이라는 구절이 없으면 평생 자기 자신보다 하나 적은 변수를 대입해서 자기자신을 부를겁니다. 컴퓨터가 답을 내놓지 못할거에요. 계속 실행을 하면서..
혹은 처음에 들어온 값이 0이거나 음수라도 똑같이 평생 자기자신 부르겠네요. 아무리 1씩 빼면서 다음 숫자를 보아도 1이 나올일이 없으니까요.

private static int factorial(int x) ~{
//3! = 3*2!(2*1!(1))
//x! = x*(x-1)!
if(x==1) ~{
return 1;
}else ~{
return x * factorial(x-1); //재귀적 호출
}

여기에 3을 넣어서 말로 풀어볼게요. 처음에 3이 들어오는데 3이 1은 아니니까 return 1은 패스하고 3*factorial(2)를 리턴하겠다고 하죠.
값을 구하려면 factorial(2)가 뭔지를 알아야겠네요. factorial(2)가 뭐인고 하니 2도 1은 아니니까 return 1은 패스하고 2*factorial(1)이 되겠네요.
여기까지 factorial(3)의 리턴값은 3*2*factorial(1)이 되는거죠. factorial(1)도 뭔지 알아보니 1은 1이니까 return 1로 갑니다.
그러면 결국 factorial(3)의 리턴값은 3*2*1 이 리턴되는거죠.

왜 if뿐인데 그러냐 하시면.. 이렇게 보시면 좀 알기 쉬우실려나요.
factorial(3) = 3 * factorial(2)
= 3 * 2 * factorial(1)
= 3 * 2 * 1
二ッキョウ니쿄
요거 달아주시는거 사이에 재귀함수개념을 찾아서 읽어보고왔습니다. 제가 말이안되는 질문을한거였어요ㅋㅋ. 재귀함수라는건 그거 자체로 하나의 개념이고 약속인데 이게 왜 약속내지는 개념이죠? 라고 증명같은걸요구한셈.. 이프ㅡ엘스 작동방식이랑 계산되는 부분들은 이해했었어서 덕분에 정확하게 배웠습니다 감사해요
주석에 적혀 있듯이 재귀적 호출이니까요...

적으신 코드의 factorial(x) 함수는 x와 factorial(x-1)을 곱해서 반환을 하는데, 1이면 1을 반환합니다.

factorial(3) 을 하면
3 * factorial(2)을 반환하는데 그 전에
factorial(2) 을 호출 하면
2 * factorial(1)을 반환하는데 그 전에,
factorial(1) 을 하면
1만을 반환하고 다시 재취호출을 하지 않으면,
2 * factorial(1) 을 2 * 1로 계산해서 반환하고
3 * factorial(2) 를 3 * (2 * 1)로 계산해서 반환하겠죠?
二ッキョウ니쿄
아 factorial 이라는게 int a 할때 a같은 임의의 용어처럼 쓰는게 아니라 재귀적 호출이라는 고유특성을 가진 함수인가요? 저는 단순히 변수 선언이라고 생각했는데 그게 아니었군요
함수 이름은 아무 상관이 없고, 단지 예시를 위한 것일 뿐이고

중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는

return x * [factorial(x-1)]; //재귀적 호출

이부분이고,

다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는

[if(x==1) ~{
return 1;
}]


이 부분입니다.

좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.... 더 보기
함수 이름은 아무 상관이 없고, 단지 예시를 위한 것일 뿐이고

중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는

return x * [factorial(x-1)]; //재귀적 호출

이부분이고,

다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는

[if(x==1) ~{
return 1;
}]


이 부분입니다.

좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.
二ッキョウ니쿄
감사합니다 찾아보겠습니다. 1에서 멈추는건if때문인건 알겠는데 재귀적호출 부분이 자기자신을 호출해서 연산이안끝나고 반복효과가 되는부분이 for이나 while을 안쓰는데 왜지 그랬었습니다 덕분에 배워갑니당
April_fool
주석 중에 답이 있네요. [재귀적 호출].
재귀(recursion)라는 것은 자기 자신을 부르는 것입니다.
二ッキョウ니쿄
재귀가 어떤 의민지는 알았는데 ㅠㅠ factorial 을 int a 에서 a 같은 것처럼 그냥 임의의 무속성 변수선언 이라고 생각했는데 재귀적호출이 factorial이라는 함수의 특징이라고 이해하면되는거죠?
April_fool
재귀함수라는 것은 A라는 함수 속에서 A 자기자신을 호출하는 경우를 뜻합니다. 자기 자신을 부르는 것은 모두 재귀호출인 것이죠.
二ッキョウ니쿄
ㅜㅜ감사합니다
유리소년
점화식으로 푸는 문제는 재귀함수를 써서 풀리지요. 같은 원리니깐..
二ッキョウ니쿄
점화식은 불을 붙여야 풀리는게 아닌가요? 핳
마무리만 지어놓으면 불붙듯이 답이착착 나와서 점화식입니다?
손나은
흠.... 6일차에게는 좀 깊은 내용이긴 한데요(...)
http://soen.kr/lecture/ccpp/cpp2/16-2-2.htm
http://marobiana.tistory.com/79
이 글들이 재귀호출을 이해하는데 도움이 될겁니다.
목록
번호 제목 이름 날짜 조회 추천
3426 IT/컴퓨터컴잘알 홍차러분들께 질문드립니다 5 게이득 17/09/26 4028 0
3427 IT/컴퓨터마우스 추천 부탁드립니다!! (수정) 11 소노다 우미 17/09/27 3643 0
3428 기타인당 5만원선 괜찮은 한정식 있나요? 5 한신 17/09/27 5156 0
3429 경제주식 양도양수 질문입니다 5 헬리제의우울 17/09/27 4784 0
3430 기타소지품 올려놓는 천(?)은 뭐라고 검색해야 할까요? 6 은채아빠 17/09/27 4235 0
3431 의료/건강의료넷에 의료질문. 귀 뚫은 자국 없애는 시술 이름이 뭔가요? 2 틸트 17/09/27 8000 0
3432 IT/컴퓨터마우스 추천 부탁드리겠습니다. 12 해시브라운 17/09/27 4371 1
3433 여행11월 해외여행지 추천 부탁 드립니다. 16 Rosinante 17/09/27 5267 0
3434 과학물리1 질문입니다. 11 구름비누 17/09/27 6693 0
3435 기타wdchat인증에서 막힙니다 2 mathematicgirl 17/09/27 3640 0
3436 의료/건강모기한테 물렸는데 피멍(?)이 들었어요. 2 성의준 17/09/28 8105 0
3437 기타여자친구 부모님 선물 질문드립니다 8 [익명] 17/09/28 7057 0
3438 기타무료로 논문을 볼 수 있는 방법이 있나요? 6 기쁨평안 17/09/28 4551 0
3439 기타비전문가가 전문가의 말의 신뢰도를 평가할 때 어떤 방법이 가장 최선일까요? 16 벤젠 C6H6 17/09/28 4134 0
3440 가정/육아김밥 재료 남은 거 얼렸다 나중에 다시 써도 되까여? 11 tannenbaum 17/09/28 7163 0
3441 기타종로근처 펜 각인해주는 곳 2 다람쥐 17/09/28 5294 0
3442 의료/건강알레르기 약 질문입니다 5 충전기 17/09/29 5269 0
3443 게임할루시네이션 아비터 아래 있는 유닛들도 클로킹이 되나요? 6 알료사 17/09/29 5292 0
3444 기타긴급) 친척 어르신들과 형님들의 자리에 긴급 초대되었는데요. 8 기쁨평안 17/09/29 4242 0
3445 기타업무 거절하는 방법. 11 침묵의현자 17/09/29 4339 0
3446 기타lastpass에서 로그인정보가 안 뜨는 현상 어떻게 해결하면 될지요...? 홍당무 17/09/29 3466 0
3447 IT/컴퓨터구글 검색 기록 저장되지 않게 하는 법이 있나요? 4 [익명] 17/09/30 4768 0
3448 IT/컴퓨터지금 제가 사용하는 이 노트북컴퓨터가 팬 돌아가는 소리가 심하게 납니다. 9 벤젠 C6H6 17/09/30 6683 0
3449 IT/컴퓨터크롬에서 마우스 휠 아래가 안먹힙니다...... 4 엉덩이가뜨거워 17/09/30 5474 0
3450 여행긴급. 대구여행 19 아침 17/10/01 3990 0
목록

+ : 최근 2시간내에 달린 댓글
+ : 최근 4시간내에 달린 댓글

댓글