ここ数時間、初心者として Python を試してきました。recurse(x) を x として返す再帰関数を書きました。Python と Java で、2 つを比較します。2 つのコードは同じですが、何らかの理由で Python は機能しますが、Java は機能しません。Python では、次のように書きました。
x = int(raw_input("Enter: "))
def recurse(num):
if num != 0:
num = num * recurse(num-1)
else:
return 1
return num
print recurse(x)
変数numは、0 になるまで num-1 を乗算し、その結果を出力します。Java では、コードは非常に似ていますが、より長くなります。
public class Default {
static Scanner input = new Scanner(System.in);
public static void main(String[] args){
System.out.print("Enter: ");
int x = input.nextInt();
System.out.print(recurse(x));
}
public static int recurse(int num){
if(num != 0){
num = num * recurse(num - 1);
} else {
return 1;
}
return num;
}
}
25 を入力すると、Python コードは 1.5511x10E25 を返します。これは正解ですが、Java コードは 2,076,180,480 を返します。これは正解ではありません。理由はわかりません。
どちらのコードも同じプロセスをたどります。
- num がゼロかどうかを確認する
- num がゼロでない場合
- num = num に num - 1 の再帰を掛けた値
- 数値がゼロの場合
- 1 を返し、再帰呼び出しのスタックを終了し、返されたすべての num の乗算を開始します。
- 戻り値
Python には括弧がありません。なんか変わったなと思ってJavaコードから括弧を外したのですが、変わりませんでした。ブール値 (num != 0) を (num > 0 ) に変更しても、何も変わりませんでした。if ステートメントを else に追加すると、より多くのコンテキストが提供されましたが、値は同じままでした。
すべてのポイントでnumの値を出力すると、関数がどのようにうまくいかないかがわかります。
パイソン:
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
51090942171709440000
1124000727777607680000
25852016738884976640000
620448401733239439360000
15511210043330985984000000
15511210043330985984000000
着実な増加。Java では:
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
1932053504
1278945280
2004310016
2004189184
-288522240
-898433024
109641728
-2102132736
-1195114496
-522715136
862453760
-775946240
2076180480
2076180480
着実な増加ではありません。実際には、関数が負の数を返しているかのように、num は負の数を返しています。
Python と Java のコードはどちらも同じ手順を踏んでいますが、大幅に異なる値を返しています。なぜこうなった?