- 질문 게시판입니다.
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
이 글들이 재귀호출을 이해하는데 도움이 될겁니다.
목록
번호 제목 이름 날짜 조회 추천
2435 IT/컴퓨터카메라 결정장애..ㅠㅠ 16 굴리 17/03/03 3955 0
2509 기타'millions of ****' 는 천 만 이상에도 쓸 수 있는 표현인가요? 1 빠른포기 17/03/15 3955 0
10362 의료/건강손이 이상해요 3 [익명] 20/10/31 3955 0
706 의료/건강하루에 포도주를 반컵씩 마십니다. 2 관대한 개장수 16/01/11 3956 0
3286 IT/컴퓨터삼성 클라우드 관련 질문드립니다 2 L'Etranger 17/08/28 3956 0
8212 철학/종교전 게으른 것일까요? 20 [익명] 19/11/07 3956 0
9420 연애위기에 처했습니다 17 [익명] 20/05/16 3956 0
2809 의료/건강공기 청정기 효과 있나요? 3 별빛 17/05/23 3957 0
7685 게임[보드게임] 질문드립니다. 4 카리 19/08/19 3957 0
8371 기타만약 이게 실제 상황이었다면 값대위는 어떤 대우를 받았을까요? 7 [익명] 19/11/28 3957 0
9391 의료/건강코로나19 확진자의 가족은 검사를 받을 수 있나요? 8 [익명] 20/05/13 3957 0
11521 여행수요일 9시에 내부순환이나 강변북로 많이 막히겠죠? 7 헌혈빌런 21/05/11 3957 0
1853 IT/컴퓨터중고폰 오프에서 살 때 뭘 확인해야 되나요? 3 진준 16/12/01 3958 0
5097 의료/건강알약의 주성분(?)은 무엇인가요? 3 기쁨평안 18/07/20 3958 0
6633 IT/컴퓨터PC 업그레이드 or 옆그레이드 조언 부탁드립니다. 5 레코드 19/02/23 3958 0
10138 문화/예술텍스트릿 같은 창작물 비평 사이트가 있을까요? 1 불타는밀밭 20/09/18 3958 0
10168 기타우유 유통기한 질문입니다 7 김치찌개 20/09/24 3958 0
10349 기타보통 늙으면 입이 가벼워지나요? 15 [익명] 20/10/29 3958 0
10520 기타4년 반만에 다시 연락한다면 미친 걸까요? 15 [익명] 20/11/28 3958 0
4171 기타북마크된사이트 알려주세요. 7 신내림 18/02/18 3959 0
9068 기타(주식) 이번과 같은 폭락을 미리 예상한 투자자들도 있을까요...?; 16 [익명] 20/03/27 3959 0
9615 의료/건강자궁적출 질문입니다 18 [익명] 20/06/19 3959 0
10009 법률내일 폭풍!!!!!이 온다는데 이사하는 날입니다 5 행운 20/08/26 3959 0
10379 기타무알코올 맛은 어떠한가요??? 11 [익명] 20/11/03 3959 0
6463 게임혹시 슬라이스 잇! 이라는 게임 아시나요? 2 DogSound-_-* 19/02/04 3960 0
목록

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

댓글