算法思想:迭代与递归

迭代与递归并不是一种具体算法,而是一种看待问题的思想

通常有的问题既可以用迭代法,又可以用递归法来解决,所以容易使人迷惑而不明白两者的区别。

两者的概念:

迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。

每一次对过程的重复称作一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值。

递归:解决问题的某一步骤中,又产生新的子问题,并且子问题的解决方式同原来的问题的解决步骤相同。

当新的子问题得到解决时,再回过头来继续解决原来的问题,则会发现问题迎刃而解。

现在通过一个简单的例子,体会两者的差异。

例:写一段程序来计算一个数的阶乘。

已知: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)

从上面可以看出,根据不同的思想,解决问题的办法不同,写出来的程序自然不同。

我们更加重要的是明白算法的思想,利用算法思想可以解决很多看起来相对复杂的问题。

猜你喜欢

转载自blog.csdn.net/qq_42864422/article/details/108950986