You need to enable JavaScript to run this app. Python如何统计递归函数迭代次数?附数独递归求解代码示例
优惠活动
大模型
产品
解决方案
定价
更多

Python如何统计递归函数迭代次数?附数独递归求解代码示例

问题根因

当前写法中counter是函数内部的局部变量,每次递归调用solver()时都会重新初始化为0,且不同递归栈的局部变量互不共享,自然无法累计总迭代次数。

方案1:外层封装+nonlocal声明(推荐,无全局污染)

把递归逻辑封装在外层函数内,计数器定义在外层作用域,内层递归函数用nonlocal关键字声明即可共享计数变量,最后可以同时返回求解结果和总次数。

def solve_sudoku():
    counter = 0
    def solver():
        nonlocal counter
        empty_cell = empty_square()
        if not empty_cell:
            return True
        i,j = empty_cell[0],empty_cell[1]
        for num in range(1,10):
            counter += 1
            if constraint_check(num,i,j):
                sudoku[i][j] = num
                if solver():
                    return True
                else:
                    sudoku[i][j] = 0
        return False
    solve_result = solver()
    return solve_result, counter

# 调用示例
result, total_count = solve_sudoku()
print(f"求解结果:{result},总迭代次数:{total_count}")

方案2:修改返回值传递计数(纯函数无共享变量)

每次递归调用都返回「求解状态 + 当前层累计的迭代次数」,不需要额外的共享变量,副作用最低。

def solver():
    empty_cell = empty_square()
    counter = 0
    if not empty_cell:
        return True, counter
    i,j = empty_cell[0],empty_cell[1]
    for num in range(1,10):
        counter += 1
        if constraint_check(num,i,j):
            sudoku[i][j] = num
            sub_result, sub_counter = solver()
            counter += sub_counter
            if sub_result:
                return True, counter
            else:
                sudoku[i][j] = 0
    return False, counter

# 调用示例
result, total_count = solver()
print(f"求解结果:{result},总迭代次数:{total_count}")

方案3:用可变对象作为计数器(写法简单)

利用列表、字典这类可变对象的引用传递特性,不需要修改函数结构即可实现计数,也可以用全局变量,但全局变量容易和其他逻辑冲突,不推荐使用。

# 定义单元素列表作为计数器,利用可变对象引用传递的特性
counter = [0]
def solver():
    empty_cell = empty_square()
    if not empty_cell:
        return True
    i,j = empty_cell[0],empty_cell[1]
    for num in range(1,10):
        counter[0] += 1
        if constraint_check(num,i,j):
            sudoku[i][j] = num
            if solver():
                return True
            else:
                sudoku[i][j] = 0
    return False

# 调用示例
result = solver()
print(f"求解结果:{result},总迭代次数:{counter[0]}")

内容的提问来源于stack exchange,提问作者Cassandra Trotter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 01:51:03