课程 3:逐步求精

  1. 逐步求精: 逐步求精是一种将复杂问题逐层细化、逐步完善解决方案的编程思想。先写出高层次的伪代码或主要步骤,再逐步将每一步细化为具体实现。
  2. 抽象化: 抽象化是通过分离信息和细节来管理复杂性,以便专注于相关概念的行为。将抽象化理解为不同级别的细节和复杂性,理解抽象化复杂性以更有效地解决问题的重要性。
    • 高层次抽象:关注"做什么"而不是"怎么做",用简单的概念描述复杂的行为。
    • 低层次抽象:关注具体的实现细节,用精确的指令描述每个步骤。
    • 抽象层次:从最抽象的目标开始,逐层向下细化,直到可以用具体代码实现。
  3. 举例:

    任务目标:让Karel把房间里的所有beeper清理干净。

    清理前
    清理前
    清理后
    清理后

    Karel清理房间的不同抽象层次

    # 最高抽象层次:目标描述
    清理房间中的所有beeper
    
    # 中等抽象层次:主要步骤
    def main():
        清理当前行
        while 还有更多行:
            移动到下一行
            清理当前行
    
    # 较低抽象层次:具体函数
    def clean_current_row():
        while front_is_clear():
            if beepers_present():
                pick_beeper()
            move()
    
    # 最低抽象层次:基本指令
    move()
    turn_left()
    pick_beeper()

    逐步求精分解思路:

    1.清理当前行

    2.移动到下一行

    3.清理当前行

    4.重复

    # 高层次伪代码
    def main():
        清理当前行
        while 左侧有路:
            移动到下一行
            清理当前行
    
    # 细化每一步
    def main():
        清理当前行
        while 左侧有路:
            移动到下一行并向西
            清理当前行
            if 右侧有路:
                移动到下一行并向东
                清理当前行
            else:
                转身
    
    # 进一步细化为具体函数
    def main():
        clean_current_row() # 防止栅栏柱错误
        while left_is_clear():
            reposition_for_row_to_west()
            clean_current_row()
            if right_is_clear():
                reposition_for_row_to_east()
                clean_current_row()
            else:
                turn_around()
    
    # 细化子任务:清理当前行
    def clean_current_row():
        while front_is_clear():
            if beepers_present():
                pick_beeper()
            else:
                move()
        # 防止栅栏柱错误:确保清理完当前行后,Karel在最后一个角落收集beeper
        if beepers_present():
            pick_beeper()
    
    # 细化子任务:移动到下一行并向西
    def reposition_for_row_to_west():
        turn_left()
        move()
        turn_left()
    
    # 细化子任务:移动到下一行并向东
    def reposition_for_row_to_east():
        turn_right()
        move()
        turn_right()
    
    # 细化子任务:向右转
    def turn_right():
        for i in range(3):
            turn_left()
    
    # 细化子任务:向后转
    def turn_around():
        turn_left()
        turn_left()
                    
  4. 好处: 逐步求精和抽象化有助于:
    • 理清思路:通过分层思考,将复杂问题分解为可管理的部分。
    • 降低编程难度:每次只关注一个抽象层次,避免被细节淹没。
    • 提升代码可读性:高层次的抽象让代码意图更清晰。
    • 提高可维护性:模块化的设计便于修改和扩展。
    • 管理复杂性:通过分离信息和细节,专注于相关概念的行为。
温馨提示:编程时遇到复杂问题,不要急于写代码,先用逐步求精和抽象化的方法理清思路,从高层次抽象开始,逐层细化,再动手实现。