如何追踪以下代码?使用递归?

时间:2015-02-19 12:27:20

标签: java recursion

a的值是6.答案是12.它是如何完成的?

    if (a==0)
        return 1;

    return (a*a)/addxy(a-1)

这个,a的值是20.怎么产生11?它必须是一个否定的答案,因为它变得像20-19-18-17 -...等等

    if (a==0)
        return 1;

    return a-addxy(a-1);

我不明白它是如何完成的。 PS:我一直在java中读取递归,就像一千次。仍然没有得到它。有人,请帮忙。

2 个答案:

答案 0 :(得分:1)

假设这是你的addxy方法

int addxy(a){
  if (a==0)
        return 1;

    return (a*a)/addxy(a-1)
}

你正在递归,事实证明这就是计算结果。

(6 * 6)/((5 * 5)/((4 * 4)/((3×3)/((2 * 2)/((1 * 1)/(1)))) ))

好的,现在告诉你为什么会这样。这是在您调用它时创建的堆栈:

a=6: (6*6)/(a=5)
a=5: (5*5)/(a=4)
a=4: (4*4)/(a=3)
a=3: (3*3)/(a=2)
a=2: (2*2)/(a=1)
a=1: (1*1)/(a=0)
a=0: 1

这就是当它碰到基础案例时堆栈的样子,现在从堆栈弹出直到你完成。

a=6: (6*6)/(a=5)
a=5: (5*5)/(a=4)
a=4: (4*4)/(a=3)
a=3: (3*3)/(a=2)
a=2: (2*2)/(a=1)
a=1: (1*1)/1

a=6: (6*6)/(a=5)
a=5: (5*5)/(a=4)
a=4: (4*4)/(a=3)
a=3: (3*3)/(a=2)
a=2: (2*2)/1

a=6: (6*6)/(a=5)
a=5: (5*5)/(a=4)
a=4: (4*4)/(a=3)
a=3: (3*3)/4 // This is (9)/4, so integer division will happen

a=6: (6*6)/(a=5)
a=5: (5*5)/(a=4)
a=4: (4*4)/2 // Note the integer division that happened to get 2

a=6: (6*6)/(a=5)
a=5: (5*5)/8

a=6: (6*6)/3

a=6: 12

答案 1 :(得分:0)

所以这是你的addxy方法

int addxy(a){
  if (a==0)
        return 1;

    return (a*a)/addxy(a-1)
}

输入:addxy(3);

<强>输出

addxy(3) : will return (3*3)/addxy(2);
addxy(2) : will return (2*2)/addxy(1);
addxy(1) : will return (1*1)/addxy(0);
addxy(0) : will return (1);

现在回溯:

(1*1)/1=1 <-------Since  addxy(0) is 1 
(2*2)/1=4 <------- Since return (1*1)/addxy(0); is 1
(3*3)/4=2 <--------- Since Integer Division so no decimal .

最终结果: 2