我正在尝试编写一个递归函数来总结数字中的数字。我就这样做了:
def f(N):
sum = 0
return foo(N,sum)
def foo(N, sum):
if N < 10:
sum = sum + N
# print 'N=', N
return sum
else:
sum = sum + N%10
# print 'N=', N, 'sum= ', sum
return sum and foo(N/10,sum)
res = f(5)
print 'N=5', 'res=', res
res = f(59)
print 'N=59', 'res=', res
res = f(568)
print 'N=568', 'res=', res
是否可以仅使用f函数进行更简单的递归,即没有'foo'函数?
答案 0 :(得分:2)
每次都不需要传递总和
def f(N):
if N < 10:
return N
else:
return N%10 + foo(N/10)
根据需要添加打印件。这将构建表达式并在它到达底部后将它们添加到一起。
注意*如果N为负,这将会中断。您可以在开头添加一个简单的检查,并使用否定执行类似的操作。
答案 1 :(得分:0)
您目前拥有的递归形式(通过递归调用传递当前总和)是一种称为tail recursion的特殊递归形式。尾递归调用通常使用辅助函数来启动它们。由于递归调用的结果没有真正的操作,它可以立即返回它而不分配更多的堆栈空间。有些编译器会对尾递归代码进行优化,所以我个人更喜欢你现有的代码。
当然,只需返回与递归调用相结合的当前结果,就可以将函数重写为单个递归函数。
def foo(N):
if N < 10:
return sum
else:
return sum%10 + foo(N/10)
这种递归形式的缺点是你可能可能耗尽堆栈空间。在这种情况下,每个递归调用都取决于所有下一个调用的结果,因此原始函数调用的本地内存可能会在等待其递归(以及该调用的递归)返回时变得臃肿。
答案 2 :(得分:0)
python真的不是一个很好的递归语言(虽然循环更好),但出于教育目的,你可以做以下事情
/usr/kernel/drv/amf64/mydrv
注意方法参数中的sum = 0,这是参数的默认值,它将被&#34;初始化&#34;如果没有参数传递给它。 (注意,keywork&#39; sum&#39;是一个内置的python方法,应该避免赋值。)
出于非教育目的,我建议使用
def foo(N, sum1=0):
if N < 10:
sum1 = sum1 + N
return sum1
else:
sum = sum1 + N%10
return foo(N/10,sum1)
foo(10)
=> 1
这会将数字转换为字符串,将字符更改回整数,然后对它们求和。它会跳过所有讨厌的师。