这个查询对你们来说可能很简单,但我真的不知道为什么我会在最后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);
}
}
}
我的问题是如何手动解决此代码。我需要使用什么等式?
答案 0 :(得分:3)
您的递归函数xyz()
中发生的事情正在总结100 to 1
。
100 + 99 + 98 + .... + 1
这意味着总结第一个nth
自然数!因此,您可以使用简单的formula来查找结果:
n(n + 1) / 2
程序中的:
n = input;
sum = n(n + 1) / 2
或者,如果你想循环查找总和,你可以这样做:
sum = 0;
for (i = 1; i <= input; i++)
sum += i; // sum = sum + i
答案 1 :(得分: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);
}
答案 2 :(得分:1)
您的程序所做的是将所有数字从1添加到num。在每次迭代中,你将num-1添加到num,所以它就像“100 + 99 + 98 + 97 ......”
您搜索的等式为(N(N + 1))/2
。
答案 3 :(得分:0)
当您第一次致电test1.xyz(100)
时,请使用参数 100 调用xyz()
方法。然后它会调用return(xyz(num-1) + num);
来调用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
语句会将{strong> 3 返回给xyz(2)
。现在编译器弹出堆栈的调用,最后返回结果。
答案 4 :(得分:0)
您可以使用&#34;迭代方法&#34;或&#34;替代方法&#34;为了解决这个问题这些方法用于计算时间复杂度,但它也适用于您的目的。
基本上,您将方法编写为数学函数。
T(n) = T(n-1) + n , n > 1
T(n) = 1 , n = 1
当你这样做时,你可以迭代i步骤的函数,这是一个随机数。有关详细信息,请查看此页面: