- 질문 게시판입니다.
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
이 글들이 재귀호출을 이해하는데 도움이 될겁니다.
목록
번호 제목 이름 날짜 조회 추천
3395 IT/컴퓨터아이디로 가입 사이트 조회하기 노인정(20대초반) 17/09/20 4415 0
3400 IT/컴퓨터윈도우10 한번 사면 평생 사용할 수 있다는 말이 8 콩자반콩자반 17/09/21 13558 0
3399 여행도움! 경주 여행 질문입니다! 10 오리꽥 17/09/21 4248 0
3398 IT/컴퓨터윈도우10 usb 설치 그냥 사이트에서 할 수 있네요? 여기서 설치시 문제점 뭔가요? 7 콩자반콩자반 17/09/20 4226 0
3401 가정/육아제사, 명절 때 남편/남자분들이 일 하시나요? 31 tannenbaum 17/09/21 4160 0
3402 의료/건강설사를 계속하면 어디로 가야하나요? 3 조홍 17/09/21 4518 0
3403 의료/건강7세 아이 작은 키 성장호르몬 치료 궁금합니다 17 [익명] 17/09/21 3297 0
3404 가정/육아산모에게 줄 수 있는 선물 고민입니다 24 [익명] 17/09/22 3461 0
3405 체육/스포츠가정용 로잉머신 괜찮은거 있을까요? 8 생존주의 17/09/22 9446 0
3406 경제전기세 명의 질문입니다 헬리제의우울 17/09/22 3974 0
3407 법률선고유예를 받고 유예기간이 경과된 경우 4 [익명] 17/09/22 2393 0
3408 기타편의점 알바 중에 이상한 일을 겪었습니다. 5 [익명] 17/09/23 2686 0
3409 IT/컴퓨터안드로이드 스마트폰의 루팅과 OS 업그레이드를 외뢰할 수 있는 곳이 있을까요? 3 Cibo & Killy 17/09/23 5818 0
3410 IT/컴퓨터컴퓨터에 문제가 생겼습니닷 2 한지민 17/09/23 3313 0
3411 IT/컴퓨터기가 허브 제품 추천부탁드립니다. 10 애패는 엄마 17/09/23 4106 0
3413 의료/건강만약 밀가루섭취를 줄이고 싶다면 보통 어떤 음식을 안 먹게 되나요? 12 원추리 17/09/23 3409 0
3414 기타오바마가 연설중 한 말인데..... 정확히 아시는 분 계시나요? 4 [익명] 17/09/23 2689 0
3416 기타강남역,삼성역 주변 질문입니다 2 김치찌개 17/09/24 2665 0
3417 가정/육아. 3 [익명] 17/09/24 2960 0
3418 게임다마고치류 모바일게임 하나 추천해주세요 1 원추리 17/09/24 3836 0
3419 기타차량용 블루투스 질문입니다 4 김치찌개 17/09/24 2496 0
3421 IT/컴퓨터노트북 인터넷 사용질문입니다. 11 二ッキョウ니쿄 17/09/25 3064 0
3422 IT/컴퓨터프로그래밍 질문입니다 19 二ッキョウ니쿄 17/09/25 3141 0
3423 철학/종교고2 윤리 집단윤리 니부어 선의지 8 초이 17/09/25 4416 0
4215 IT/컴퓨터엑셀 허접이 질문하나 드립니다. 2 [익명] 18/02/28 2254 0
목록

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

댓글
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기