繁体   English   中英

将递归方法转换为公式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM