python - 为什么递归函数两次考虑数组中的最后一个元素?
问题描述
试图理解递归函数,因此创建了这个程序,但输出不正确。想了解我在这里做错了什么
class Recursive:
def __init__(self, arr):
self.arr = arr
self.sum = 0
def sumRecursive(self):
if len(self.arr) == 0:
return self.sum
self.sum = self.arr.pop(0)
return self.sum + self.sumRecursive()
def main():
recur = Recursive([1,2,3])
print(recur.sumRecursive())
main()
输出:9
解决方案
有两种类型的递归需要考虑:尾递归,其中单个递归调用的返回值按原样返回,以及“常规”递归,您可以对递归调用的返回值做一些事情。 ) 在返回之前。
你正在将两者结合起来。您可以将列表中的一个值添加到递归总和,不使用累加器:
def non_tail_recursive(self):
if len(self.arr) == 0:
return 0
return self.arr.pop(0) + self.non_tail_recursive()
或者您使用累加器:
def tail_recursive(self):
if len(self.arr) == 0:
return self.sum
self.sum += self.arr.pop(0)
return self.tail_recursive()
推荐阅读
- typescript - 为什么 Typescript“无法重新声明块范围的变量”?
- r - R Plotly多线时间序列图
- firebase - Firebase - 在不指定 UID 或电子邮件地址的情况下获取用户帐户
- matplotlib - 带突出显示的 Matplotlib 直方图
- asp.net-core-webapi - ASP.NET Core Web API DELETE 调用返回 405
- php - 从特定类别中删除 WooCommerce 产品库
- ios - Xcode 更新搞砸了 Storyboard 约束
- javascript - NodeJS Redis - 在后台重新连接
- python - Python,使用 cv::imwrite 从 Open CV 保存图像 - 错误消息权限被拒绝 [WARN:0]
- gnuplot - Gnuplot 线性拟合 f(x) = a*x