Problem:
コラッツの予想

正の整数 n に対し、

n が偶数の時は 2 で割る。

n が奇数の時は 3 倍し、1 を足す。

という操作を繰り返すと結果が 1 になります。任意の正の整数 n に対してこの操作を繰り返すと必ず 1 になるであろうというのが「コラッツの予想」と呼ばれる問題です。この問題は日本では、「角谷の問題」としても知られている未解決の問題です。コンピュータを利用して非常に大きな数 3 × 253 = 27,021,597,764,222,976 以下については反例がないことが知られていますが、数学的には証明されていません。

整数 n を入力とし、結果が 1 になるまでに繰り返される操作の回数を出力するプログラムを作成してください。整数 n は 1 以上でかつ上記の計算を繰り返す途中の値が 1000000 以下となる程度の整数とします。たとえば、入力として 3 を受け取った場合は、操作列は

3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

になるので、操作の回数（上の矢印の個数）である 7 を出力します。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットとして１つの整数 n (n ≤ 1000000) が１行に与えられます。

データセットの数は 50 を越えない。

Output

データセットごとに操作の回数を１行に出力します。

Sample Input

3
10
0

Output for the Sample Input

7
6

Solution in JAVA (judge verdict: Accepted)

import java.util.*;


class Main {
        public static int dp[];
        public static int MM = 1000001;
        public static void main(String args[]) {
                Scanner sc = new Scanner(System.in);
                dp = new int[MM];
                for (int i = 0; i < MM; i++) {
                        dp[i] = -1;
                }
                while (true) {
                        int N = sc.nextInt();
                        if (N == 0) {
                                break;
                        }
                        System.out.println(recursion(N));
                }
        }
        public static int recursion(int in) {
                if (in == 1) {
                        return 0;
                }
                if (in < MM) {
                        if (dp[in] != -1) {
                                return dp[in];
                        } else {
                                if (in % 2 == 1) {
                                        return dp[in] = recursion(in * 3 + 1) + 1;
                                } else {
                                        return dp[in] = recursion(in / 2) + 1;
                                }
                        }
                } else {
                        if (in % 2 == 1) {
                                return recursion(in * 3 + 1) + 1;
                        } else {
                                return recursion(in / 2) + 1;
                        }
                }
        }
}