- 질문 게시판입니다.
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
이 게시판에 등록된 二ッキョウ니쿄님의 최근 게시물
|
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)라는 함수를 부른다는 뜻이에요.
처음에 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)라는 함수를 부른다는 뜻이에요.
factorial 자신이 자기자신 안쪽에서 factorial을 불러서 그런겁니다.
factorial 안쪽에서 if 로 behavior를 갈라놓았죠.
만약 if (x==1)이라는 구절이 없으면 평생 자기 자신보다 하나 적은 변수를 대입해서 자기자신을 부를겁니다. 컴퓨터가 답을 내놓지 못할거에요. 계속 실행을 하면서..
혹은 처음에 들어온 값이 0이거나 음수라도 똑같이 평생 자기자신 부르겠네요. 아무리 1씩 빼면서 다음 숫자를 보아도 1이 나올일이 없으니까요.
private static int factorial(int x) ... 더 보기
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 안쪽에서 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(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)로 계산해서 반환하겠죠?
함수 이름은 아무 상관이 없고, 단지 예시를 위한 것일 뿐이고
중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는
return x * [factorial(x-1)]; //재귀적 호출
이부분이고,
다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는
[if(x==1) {
return 1;
}]
이 부분입니다.
좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.... 더 보기
중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는
return x * [factorial(x-1)]; //재귀적 호출
이부분이고,
다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는
[if(x==1) {
return 1;
}]
이 부분입니다.
좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.... 더 보기
함수 이름은 아무 상관이 없고, 단지 예시를 위한 것일 뿐이고
중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는
return x * [factorial(x-1)]; //재귀적 호출
이부분이고,
다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는
[if(x==1) {
return 1;
}]
이 부분입니다.
좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.
중요한 부분은 자기자신을 다시 호출하는 부분, 그러니까 이 소스에서는
return x * [factorial(x-1)]; //재귀적 호출
이부분이고,
다음으로 중요한 부분은 재귀호출을 더 이상 사용하지 않고 끝내는
[if(x==1) {
return 1;
}]
이 부분입니다.
좀 더 자세한 사항은 재귀함수에 대해서 찾아보시는 것이 좋아요.
흠.... 6일차에게는 좀 깊은 내용이긴 한데요(...)
http://soen.kr/lecture/ccpp/cpp2/16-2-2.htm
http://marobiana.tistory.com/79
이 글들이 재귀호출을 이해하는데 도움이 될겁니다.
http://soen.kr/lecture/ccpp/cpp2/16-2-2.htm
http://marobiana.tistory.com/79
이 글들이 재귀호출을 이해하는데 도움이 될겁니다.
목록 |
|