【发布时间】:2021-11-27 01:14:48
【问题描述】:
int test(int n) {
if(n <= 2)
{
return n;
}
return test(n-1) + test(n-2) + test(n-3);
}
有什么方法可以在不改变函数声明的情况下加快速度,当n变大时,需要大量时间才能输出。
0.1.2.3.6.11.20
当n = 3时,应该得到输出0+1+2=3
当n = 5时,应该得到输出2+3+6=11
【问题讨论】:
-
使用记忆化,这样您就不会对已处理的输入进行完全递归。
-
是否需要使用递归?因为这基本上是一个修改过的斐波那契计算器,而斐波那契实际上是递归的一个可怕问题(它用递归很好地描述了,但它是
O(2**n)递归实现的,而O(n)是迭代实现的;这段代码将是O(3**n)递归的,仍然是O(n)迭代),除非意图是强迫你学习使用记忆来优化递归。 -
“不改变 test(int n)”是什么意思?您只是不想更改函数的声明方式
test(int n),还是根本不想更改函数?如果您根本不想更改函数,您如何想象可以在不更改函数源代码的情况下更改函数的行为(包括性能)?更改编译器优化?改变它的叫法?用宏偷偷改变有效源代码? -
Is there any way to speed it up without changing test(int n)我唯一的想法就是买更快的电脑 -
肯定有一个
O(1)算法来计算这个,就像斐波那契数的算法一样。但我不知道怎么做。