下面两个程序是scheme写的计算阶乘的递归和尾递归实现
线性递归:
(define (factorial n) (if (=n 1) 1 (* n (factorial (- n 1)))))
尾递归:
(define (factorial n) (fact-iter 1 1 n)) (define (fact-iter product counter max-count) (if (> counter max-count) product (fact-iter (* counter product) (+ counter 1) max-count)))
用C写出来就是这样的:
线性递归:
long factorial(long n) { return(n == 1) ? 1 : n * factorial(n - 1); }
尾递归:
long fact_iter(long product, long counter, long maxcount) { return (counter > maxcount) ? product : fact_iter(product*counter, counter+1, maxcount); } long factorial(long n) { return fact_iter(1, 1, n); }
线性递归程序基于阶乘的递归定义,即:对于一个正整数n,n!就等于n乘以(n-1)!:
n! = n[(n-1)(n-2)…3*2*1] =n(n-1)!
程序一在计算4!时的过程是这样的:
(factorial 4)
(* 4 (factorial 3))
(* 4 (* 3 (factorial 2)))
(* 4 (* 3 (* 2 (factorial 1))))
(* 4 (* 3 (* 2 1)))
(* 4 (* 3 2))
(* 4 6)
24
而尾递归程序用的是另一种计算规则,即先用1乘以2,再将得到的结果乘以3,再乘以4,这样下
去直到n。程序中维持着一个变动中的乘积product,以及一个从1到n的计数器counter,这一
计算过程中的product和counter在每一步都按照下面规则改变:
product = counter * product
counter = counter + 1
这样循环下去,可以得到n!也就是计数器counter超过n时乘积product的值。
所以程序二在计算4!的过程是这样的:
(factorial 4)
(fact-iter 1 1 4)
(fact-iter 1 2 4)
(fact-iter 2 3 4)
(fact-iter 6 4 4)
(fact-iter 24 5 4)
24
一个对自己本身的递归尾调用,就叫做尾递归。这里尾调用的“尾”字,是指运行
时需要执行的最后一个动作。不是简单的语法字面上的最后一个语句。 尾递归实
际执行的是迭代的计算过程。
线性递归函数必须满足以下两个基本属性: