python - 如何通过Python中的递归函数携带变量?
问题描述
我在做一些 leetcode 问题,发现我不能像我想的那样通过递归函数携带我的变量。
例如,假设我想对树的所有节点求和。
所以我想以这种方式实现它:
def Sum(root):
def dfs(root,x):
if root:
dfs(root.left, x)
x.append(root.val)
dfs(root.right,x)
return x
return(sum(dfs(root,x=[])))
这有效。但是,假设我想减少内存,为什么这个实现不起作用,只是返回根节点。
def Sum(root):
def dfs(root,x):
if root:
dfs(root.left, x)
x+=(root.val)
dfs(root.right,x)
return x
return(sum(dfs(root,x=0)))
任何帮助或指导将不胜感激。
解决方案
x
在您的第一个定义中是可变的;每次调用dfs
都会引用同一个列表。
在您的第二个示例中,x
is immutable。的值x
不会被递归调用修改;x += root.val
只是更新参数的本地副本。
相反,您需要将 的返回值dfs
直接添加到x
.
def Sum(root):
def dfs(root, x):
if root:
x += dfs(root.left, x)
x += root.val
x += dfs(root.right,x)
return x
return dfs(root, x=0)
无需定义dfs
,因为您实际上不再进行通用搜索或步行。只需Sum
递归调用。还有,返回值就足够了;你根本不需要x
争论。
def Sum(root):
if not root:
return 0
else:
return Sum(root.left) + root.val + Sum(root.right)
推荐阅读
- go - 大摇大摆的一代正在忽略 SecurityDefiniton
- python - Keras Cnn 模型不会提高准确性
- oracle - DBMS_SCHEDULER.CREATE_JOB 返回“未知命令”
- ocaml - ReScript 中的无限列表/流
- asp.net-mvc - MVC 表单需要基于选择
- mysql - 从 MySQL 中的日期列获取每月计数
- swift - 如何在架构 MVC 中安排视图?通过代码编码时
- c++ - 为什么某些程序在前台时,Windows 的 SetCursorPos 无效?
- rabbitmq - Rabbitmq 部署使用 helm 伞形图和 rabbitmq 操作符与 kubernetes
- r - 如何更改此热图中的颜色?