add' -> + mul add' | ε
对于这条规则里的递归,有个术语叫尾递归。即产生式箭头的右边在尾部调用产生式的箭头左边。尾递归改写为循环是优化写法。因为循环比递归在系统开销上更少。
计算n的阶乘,n*(n-1)*(n-2)*...*1
记f(n)表示n的阶乘,则f(n) = n * f(n-1)
int factorial(int n) {
if(n == 1) {
return 1;
}
return n * factorial(n-1);
}
这个就是典型的尾递归。改写成循环
int factorial(int n) {
int result = 1;
while(n > 1) {
result *= n;
n--;
}
return result;
}