说有一个计算阶乘(n)的函数
factorial(7)是否为1到7的每个n创建了7个函数对象
并在必要时使用这些值(对于阶乘(8),如阶乘(7)* 8)
答案 0 :(得分:6)
这取决于语言和语言实现。
在许多函数式语言(例如Haskell)中,保证函数不会改变任何东西;只返回一个值。缺乏副作用使语言能够记住/缓存或“记忆”函数调用的结果。
在一种不太复杂的语言中,可能会在堆栈上放置7个不同的函数调用框并弹出。
许多函数语言中正确编写的因子函数也是尾递归的;在这种情况下,语言可能会选择简单地从函数的底部跳转到顶部以避免创建另一个函数调用。在这种情况下,语言将递归函数转换为“免费”循环。
答案 1 :(得分:4)
这取决于,听起来像是在谈论递归因子函数:
int factorial(int n) {
return n>=1 ? n * factorial(n-1) : 1;
}
此函数将调用自己recursively计算给定阶乘(n)所需的次数。
通常使用堆栈来累积连续结果,所有递归函数都可以转换为迭代解决方案......
int factorial(int n) {
int accu = 1;
int i;
for(i = 1; i <= n; i++) {
accu *= i;
}
return accu;
}
答案 2 :(得分:1)
它可以。您所要求的内容听起来像是 memoization - 您之前将结果存储到速度计算中。因此,例如,如果计算9!,则可以将值存储为1! .. 9!,如果你被要求8!以后你可以只返回存储的值。同样,如果要求10 !,你可以计算10×9!快。
事实是因子( n )增长如此之快,对于 n 的大值,你最终可能会使用大量存储空间,因此时空交易可能不值得。
另一个可以有效使用memoization的函数是计算Fibonacci数。