将递归方法转换为公式

时间:2015-07-09 06:24:57

标签: java algorithm recursion

这个查询对你们来说可能很简单,但我真的不知道为什么我会在最后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);
        }
    }
}

我的问题是如何手动解决此代码。我需要使用什么等式?

5 个答案:

答案 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)=1n=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)+2xyz(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步骤的函数,这是一个随机数。有关详细信息,请查看此页面:

Analysis of Algorithm - geeksforgeeks