fib_2()
は再帰だとは思わないので、私は友人と議論していますが、それは自分自身を呼び出すためです。
fib_2()
には、別のfib_2()
の引数として使用するための戻り値がないため、そうは思わないでしょう。 私はfib_2()
がfib_3()
と同じだと思います。それは反復であり、再帰ではありません。これは再帰ですか?そうではありませんか?
これは再帰かどうかですか?
public class Demo {
public static void main(String[] args) {
System.out.printf("fib_1 -> %d\n", fib_1(10));
System.out.printf("fib_2 -> %d\n", fff(10));
System.out.printf("fib_3 -> %d\n", fib_3(10));
}
//This is recursion
public static int fib_1(int n) {
if (n == 1 || n == 2)
return 1;
return fib_1(n - 1) + fib_1(n - 2);
}
//Is this recursion or not ?
public static int fff(int n) {
int a = 1, b = 1, c = 0, count = 2;
return fib_2(a, b, n, c, count);
}
public static int fib_2(int a, int b, int n, int c, int count) {
if (count == n) {
return c;
}
int tmp = b;
b = a + b;
a = tmp;
c = b;
++count;
return fib_2(a, b, n, c, count);
}
public static int fib_3(int n) {
int a = 1, b = 1;
for (int i = 2; i < n; i++) {
int temp = b;
b = a + b;
a = temp;
}
return b;
}
}
しかし、バックトラッキングはありません – Saber
あなたはfib_2コールのスタックを構築しています。ベースケース(count == n)をヒットすると、スタック全体をリターンで戻します。 – MrOerni
@Saber fib_2関数の両方を単一の関数として参照しているため、混乱が生じます。 – MrOerni