该方法将无限递归

时间:2017-03-15 17:50:18

标签: java recursion

给出以下方法声明:

public static int fact(int num) {
    int tmp = 1;
    for (int i = 1; i <= num; i++) {
        tmp *= i;
    }
    return tmp;
}

我想再次将其作为递归方法编写,然后编写一个完整的程序,从用户那里获取输入并找出事实(num)。

我写了这篇文章,却无法让它变得无限:

public static int fact(int num) {
    int t = 1;
    int i = 0;
    if(i <= num) {
        t *= i;
    }
    return fact(t);
}

3 个答案:

答案 0 :(得分:1)

在您的示例中,num根本没有减少,因此,它会进入无限的重复,使用相同的参数值调用相同的method

简化版本如下所示:

public static int fact(int num) {
    if(num <= 1){
        return 1;
    }
    return num*fact(num-1);
}

答案 1 :(得分:0)

每次运行时,成功的递归函数都必须向基本情况前进。

使用阶乘函数,您必须在进入递归调用之前从参数中减去1。 (为什么?因为var randomTime = 1.9 let spritestater = SKSpriteNode(imageNamed: "spritea1.png") let sprite1 = SKAction.setTexture(SKTexture(imageNamed:"spritea1.png")) let sprite2 = SKAction.setTexture(SKTexture(imageNamed: "sprite1b.png")) override func didMove(to view: SKView) { spritestater.scale(to: self.frame.size) spritestater.anchorPoint = CGPoint(x: 1, y: 1) spritestater.zPosition = 1 spritestater.position = CGPoint(x: self.frame.maxX, y: self.frame.maxY) addChild(spritestater) let anamatesprite = SKAction.repeatForever(SKAction.sequence( [sprite1, SKAction.wait(forDuration: TimeInterval(randomTime)), sprite2, SKAction.wait(forDuration: 0.3), ])) spritestater.run(anamatesprite) } override func update(_ currentTime: TimeInterval) { randomTime = Double(arc4random_uniform(UInt32(4.5))) } 会使用fact(5)的结果,而后者又会使用fact(4)的结果。)

因此,在return语句中,您将使用当前参数和递归调用的结果执行计算 - 即您将进行调用fact(3)并将其乘以{{1} }。

请注意,您不需要fact(num - 1),因为方法参数将扮演“计数器”的角色,只是随着每次调用而下降。

示例:

num

答案 2 :(得分:0)

试试这个:

public static int fact(int num){
    //This is the ending condition
    if(num == 0 || num == 1){
        return 1; 
    }

    //Otherwise return num * fact(num - 1)
    return num * fact(num-1);
}

它的工作原理示例:

如果您将3作为输入,您将获得:

3 * fact(3 - 1) = 3 * 2 * fact(2 - 1) = 3 * 2 * 1 = 6