迭代与递归并不是一种具体算法,而是一种看待问题的思想
通常有的问题既可以用迭代法,又可以用递归法来解决,所以容易使人迷惑而不明白两者的区别。
两者的概念:
迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。
每一次对过程的重复称作一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值。
递归:解决问题的某一步骤中,又产生新的子问题,并且子问题的解决方式同原来的问题的解决步骤相同。
当新的子问题得到解决时,再回过头来继续解决原来的问题,则会发现问题迎刃而解。
现在通过一个简单的例子,体会两者的差异。
例:写一段程序来计算一个数的阶乘。
已知:n! = n * (n-1) * (n-2) * (n-3) *...* 2 * 1
方法一:迭代法
例如计算 5的阶乘,我们知道5! = 5 * 4 * 3 * 2 *1
第1次:result = 5
第2次:result = (5) * 4 = 20
第3次:result = (5 * 4) * 3 = 20 * 3 = 60
第4次:result = (5 * 4 * 3) * 2 = 60 * 2 = 120
第5次:result =( 5 * 4 * 3 * 2 ) * 1 = 120 * 1 = 120
经过5次迭代,得到正确的结果。而且我们发现括号里面的可以用上一次迭代的结果进行代替。
那么此时我们可以编写程序(Python语言):
n = 5 #计算5的阶乘
result = n #第一次迭代
result = result * 4 #第二次迭代
result = result * 3
result = result * 2
result = result * 1
print(result) #输出结果:120
当然我们可以继续寻找规律,后面的因子每次都减一。
此时我们可以改造程序,利用循环控制变量的递减
n = 5 #计算5的阶乘
result = n
i = n-1
while(i >= 1) :
result = result * i
i = i - 1
print(result) #输出结果:120
方法二:递归
用递归的角度看待这个问题:
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1
求5的阶乘的步骤中,出现了求4的阶乘,求4的阶乘与求5的阶乘的步骤一样,到最后能求出1的阶乘。
所以我们可以先解决子问题,得到子问题的解,但是求子问题的解只是原来问题的一个步骤,所以一定有一个回归的过程。
要注意的是,一定要有一个递归的出口才能得到问题的解,否则永远产生在产生新的问题,就无法解决。
所以阶乘的递归定义式:
令 f(n) = n!
当n =1 时,f(n) = 1 ;
当 n>1 时,f(n) = n * (n-1)!
所以我们可以编写以下程序:
# 定义阶乘函数
def f(n):
if n == 1 :
return 1
return n * f(n-1)
result = f(5)
print(result)
从上面可以看出,根据不同的思想,解决问题的办法不同,写出来的程序自然不同。
我们更加重要的是明白算法的思想,利用算法思想可以解决很多看起来相对复杂的问题。