给出以下方法声明:
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);
}
答案 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