递归函数

时间:2010-12-17 04:33:42

标签: c recursion

给出以下递归函数:

// Pre-condition: y is non-negative.
int mysterious(int x, int y) {
    if (y == 0) return x;
    return 2*mysterious(x, y-1);
}

神秘(3,2)的回报值是什么?

这是我的调用堆栈:

return 2*mysterious(3, 2-1) => 2*3 => 6, 2*1 => mysterious(6,2)
return 2*mysterious(6, 2-1) => 6*2 => 12, 2*2 => mysterious(12, 2)

但似乎y永远不会达到0.我做错了什么?

5 个答案:

答案 0 :(得分:8)

mysterious(3, 2)

= 2 * mysterious(3, 1)
= 2 * 2 * mysterious(3, 0)
= 2 * 2 * 3
= 12

答案 1 :(得分:0)

如果您扩展该呼叫,则实际上有

(2*(2*(3))) == 12

Y只会减少(每次调用1次),因此该函数显然是递归的,应终止y>=0

答案 2 :(得分:0)

每次调用神秘(一次由你,两次递归),y减1。

所以,你得到(神秘)

3 2
3 1
3 0

最终值为12(3 * 2 * 2)

答案 3 :(得分:0)

mysterious(3, 2)
    y(==2) is not 0 therefore it 
    returns 2 * mysterious(3, 1)
        mysterious(3,1)
            y(==1) is not 0 so it 
            returns 2 * mysterious(3 , 0)
                mysterious(3 , 0) 
                    return 3 because y == 0
            2 * 3 = 6
    2 * 6 = 12

x永远不会被修改,但每次递归调用y减1,当到达ground子句(if y == 0)时,它返回x(第一次调用时为3) )

答案 4 :(得分:0)

这不过是

x * 2**y

mysterious(x, y) == x*pow(2, y)

因此可以为y

的任何值定义