[英]Translate recursive method to formula
对于你们来说,这个查询可能很简单,但我真的不知道为什么我在过去2小时内摸不着头脑。
下面是简单的代码,循环通过相同的方法99次,结果将给出5050。
class test {
public static void main(String args[]) {
test test1 = new test();
System.out.println(test1.xyz(100));
}
public int xyz(int num) {
if(num ==1) {
return 1;
}
else {
return(xyz(num-1) + num);
}
}
}
我的问题是如何手动解决此代码。 我需要使用什么等式?
递归函数中发生的事情xyz()
总结为100 to 1
。
100 + 99 + 98 + .... + 1
这意味着总结第nth
自然数! 所以你可以用一个简单的公式来找到结果:
n(n + 1) / 2
在程序中:
n = input;
sum = n(n + 1) / 2
或者,如果要循环查找总和,可以执行以下操作:
sum = 0;
for (i = 1; i <= input; i++)
sum += i; // sum = sum + i
对于n=1
,该等式实际上是f(n) = f(n-1) + n
并且f(n)=1
n=1
。 这实际上是所有数字的总和,对于n=100
,结果是(100*101)/2 = 5050
因为自然数之和是: n(n+1) / 2
。 该方法是递归的。
如果你想要一个迭代版本,那么你需要使用一个循环。 例如:
public static void main(String[] args) {
int result = 0;
for (int i=0; i<=100; i++) {
result = result + i;
}
System.out.println(result);
}
你的程序所做的是将所有数字从1添加到num。 在每次迭代中,你将num-1添加到num,所以它就像“100 + 99 + 98 + 97 ...”
您搜索的等式是(N(N + 1))/2
。
当您第一次调用test1.xyz(100)
它使用参数100调用xyz()
方法。 然后它调用return(xyz(num-1) + num);
meas它调用xyz(99)
并在其中添加100 。 因为xyz(99)
尚未评估,所以它被推入堆栈。 在调用xyz(99)
,它调用return(xyz(num-1) + num);
测量它调用xyz(98)
并在其中添加99
。 因为xyz(99)
尚未评估,所以它被推入堆栈。 它一直在堆栈中调用xyz()
,直到你调用xyz(1)+2
。 xyz(1)
按代码返回1 。 所以xyz(1)+2
语句将3返回到调用xyz(2)
。 现在编译器弹出堆栈的调用,最后返回结果。
您可以使用“迭代方法”或“替换方法”来解决此问题。 这些方法用于计算时间复杂度,但它也适用于您的目的。
基本上,您将方法编写为数学函数。
T(n) = T(n-1) + n , n > 1
T(n) = 1 , n = 1
当你这样做时,你可以迭代i步骤的函数,这是一个随机数。 有关详细信息,请查看此页面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.