递归
标准没有说递归需要用堆栈实现,但是很多编译器都是这样
逆序实现上使用递归比较合适。
尾部递归
阶乘和斐波那契数并不适合递归,前者无好处,后者效率很低。
阶乘
//阶乘递归
long
factorial(int n){
if(n <= 0)
retrun 1;
else
return n * factorial(n - 1);
}
如果仔细观察实现的递归函数,发现递归调用的时机是函数的最后,此时可以用一种循环实现:
//阶乘迭代
long
factorial(int n){
int result = 1;
while(n > 1){
result *= n;
n -= 1;
}
return result;
}
斐波那契
//斐波那契递归
long
fibonacci(int n){
if(n <= 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
//斐波那契迭代
long
fibonacci(int n){
long result;
long previous_result;
long next_older_result;
result = previous_result = 1;
while(n > 2){
n -= 1;
next_older_result = previous_result;
previous_result = result;
result = previous_result + next_older_result;
}
return result;
}
甚至斐波那契已经可以用公式表示了:https://blog.paulhankin.net/fibonacci/
Last updated
Was this helpful?