테스트 사이트 - 개발 중인 베타 버전입니다

php 우박수 구하기 채택완료

찬돌이 4년 전 조회 3,414

php로 우박수를 구하는 방법을 알고 싶습니다.

< 계산 규칙 >

1.자연수 하나를 고른다.

2.고른 수가 짝수이면 로 나누고, 홀수이면 3을 곱하고 1을 더한다.

3.2의 과정을 반복하면 그 결과는 항상 1이 된다.

< 우박수 해석 >

- 양의 정수 n에 대하여, 다음과 같은 계산 과정을 반복하기 한다. - n -> n/2 (n이 짝수일 경우) - n -> 3 * n + 1 (n이 홀수일 경우) - 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 ->1 - 콜라츠 추측 이라고 하며, 이런 수들을 우박수라 부르기도 한다.

< 파이썬 >

def Collatz(n):     print(n, end=", ")     if n == 1:         return 1     elif n%2: # 홀수         Collatz(3*n+1)     else: # 짝수         Collatz(n//2) x = int(input()) Collatz(x)

- 파이썬은 재귀 함수를 사용하여 구하는 방법등 여러가지 있습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
유판
4년 전

php 에서도 동일하게 재귀함수로 처리하셔도 됩니다.

 

</p>

<p>function Collatz($n){</p>

<p>  echo $n.", ";</p>

<p> </p>

<p>  if($n == 1)</p>

<p>    return 1;</p>

<p>  else if($n % 2)</p>

<p>    Collatz( (3 * $n) + 1);</p>

<p>  else</p>

<p>    Collatz($n / 2);</p>

<p>}</p>

<p>

 

위 파이썬 내용을 PHP로 변환한 코드이며, 사용에는 form문 또는 Ajax와 같이 비동기 처리 방식을 통해 처리 하여 출력하시면 됩니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

찬돌이
4년 전
[code]
function collatz($n) {
$list_data = [];
array_push($list_data, $n);
if($n==1) {
return $list_data;
}
elseif($n % 2) {
collatz((3*$n)+1);
}else {
collatz($n/2);
}
}
print_r(collatz(10));
[/code]
내용이 출력 되지 않는데 무엇이 잘 못 되었나요?
유판
4년 전
리스트로 쌓으려면 매개변수에 추가적인 배열을 같이 보내야합니다.

[code]
function collatz($n, $arr) {
if(!isset($arr))
$arr = [];
array_push($arr, $n);
if($n==1) {
return $arr;
}
elseif($n % 2) {
collatz((3*$n)+1, $arr);
}else {
collatz($n/2, $arr);
}
}
print_r(collatz(10));
[/code]

예로 한번 보여드렸는데, 현재 테스트를 못해서 되는지 안되는지는...
이후에 테스트 깔끔한 코드로 다시 댓글 드리겠습니다.
유판
4년 전
다른 방식으로는 global로서 외부의 배열을 이용하는 방법도 있습니다.

댓글을 작성하려면 로그인이 필요합니다.

4년 전

아래 예제코드를 잘 이용해 보세요.

$x = 3; // 임의의 자연수

if (is_int($x) && $x <= 0)     exit("자연수를 입력하세요");

function Collatz($n) {

    if ($n == 1)         return 1;

    if ($n % 2 == 0) { //짝수인 경우         echo "짝수 $n \n";          Collatz($n / 2);     }     else {         echo "홀수 $n \n";         Collatz($n * 3 + 1);     } }

$r =  Collatz($x);

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인