算法思想:迭代与递归

    科技2024-06-06  73

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

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

     

    两者的概念:

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

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

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

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

     

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

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

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

     

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

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

    Processed: 0.012, SQL: 8