我有递归函数:T(n)= 2T(n / 2)+ n。我想通过向函数传递不同的参数并获取函数的值来找到函数的复杂性。然后我会猜测函数的公式(例如n,n * log(n))。
我写下面的代码:
public static void main(String[] args) {
System.out.println(findValueOfTheFunction(2));
System.out.println(findValueOfTheFunction(4));
System.out.println(findValueOfTheFunction(8));
}
static double findValueOfTheFunction(double n) {
if(n > eps) {
return 2*findValueOfTheFunction(n/2) + n;
}
else return 0;
}}
我从代码中得到三分。 p1(2,10)和p2(4,24)和p3(8,56)。
据了解,递归函数的复杂性是O(n)= n * log(n)。但我的观点不符合公式。
我在这里做了一些研究,但似乎没有人有类似的问题。
答案 0 :(得分:0)
你的第一个问题就在这里:
else return 0;
在某些时候;你的递归结束了;并达到那个。
然后你开始乘以最后一次调用的结果...并猜猜x * y * z * ... * 0可能计算到什么?!
所以你的方法所做的就是返回一些m * n值(其中n是你的输入; m取决于你递归调用自己的方法的频率。当你的代码转换为:
if (n>eps) {
return n + findValueOfTheFunction(n/2)
长话短说:你的计算失去了结果的“有趣”部分。所以 - 而不是返回0 ...返回1!
答案 1 :(得分:0)
你必须为此编写代码吗?你可以通过给n赋值然后替换来做一些数学运算:
t(1) = 2t(1/2) + 1
t(2) = 2t(1) + 1 = 2(2t(1/2)+1) = 2*2t(1/2)
t(4) = 2t(2) + 1 = 2*2*2*t(1/2)
t(8) = 2t(4) + 1 = 2*2*2*2*t(1/2)
剩下的2 * 1不是那么重要,你可以继续使用t(1/2)部分。我想已经有些事情要发生了。