初始化的递归函数

时间:2015-07-15 17:54:57

标签: python recursion

我正在尝试编写一个递归函数来总结数字中的数字。我就这样做了:

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'函数?

3 个答案:

答案 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

这会将数字转换为字符串,将字符更改回整数,然后对它们求和。它会跳过所有讨厌的师。