程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了制作强数字程序时的最大递归部门错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决制作强数字程序时的最大递归部门错误?

开发过程中遇到制作强数字程序时的最大递归部门错误的问题如何解决?下面主要结合日常开发的经验,给出你关于制作强数字程序时的最大递归部门错误的解决方法建议,希望对你解决制作强数字程序时的最大递归部门错误有所启发或帮助;

我被要求编写一个程序,如果当前数字不是强数字,但我得到最大深度误差,该程序将找到下一个强数字。

我的代码

def solution(n):
    m = str(n)
    dig = map(int,m)
    digits = List(dig)
    sum = 0
    factorial = 1
    for i in digits:
        if i == 0:
            sum += 1
        else:
            for i in range(1,i + 1):
                factorial = factorial*i
            sum += factorial
     
    if sum == n:
        return sum
    elif sum != n:
        solution(n + 1)

print(solution(140))

解决方法

您的问题是您使用的是递归函数。 Python 只允许如此多的递归。您可以改用循环:

def solution(n):
    while True:
        m = str(n)
        dig = map(int,m)
        digits = list(dig)
        mysum = 0
        factorial = 1
        for i in digits:
            if i == 0:
                mysum += 1
            else:
                for i in range(1,i + 1):
                    factorial = factorial*i
                mysum += factorial
     
        if mysum == n:
            return mysum
        elif mysum != n:
            mysum = 0
            n = n + 1

print(solution(140))

修复代码中的其他错误后,它看起来像这样

def solution(n):
    while True:
        m = str(n)
        dig = map(int,m)
        digits = list(dig)
        mysum = 0
        for i in digits:
            factorial = 1 # Needs to be set to 1 for every iteration
            if i == 0:
                mysum += 1
            else:
                for x in range(1,i+1):
                    factorial = factorial * x
                mysum += factorial 

        if mysum == n:
            return mysum
        elif mysum != n:
            mysum = 0
            n = n + 1

print(solution(140)) # prints 145
print(solution(146)) # prints 40585

也不要使用 sum 作为变量名,因为它是一个内置函数。

,

以下更正允许发布的代码运行

  1. factorial 必须在循环开始时重置为 1 以进行阶乘计算
  2. 不要使用与流行的内置函数(即 sum)相同的变量名
  3. 为了让函数能够递归,我们必须执行 Tail Call Optimization,否则,我们很快就会克服 Python 堆栈帧限制。
  4. Python 不提供开箱即用的尾调用优化,但可以使用 Tail Recursion In Python 中的方法轻松实现
  5. 返回递归调用的值,即 solution(n +1) 不返回值

代码中突出显示的更正。

代码

 #-------------------------------------------------------
 # Decorator class to allow for optimized tail recursion
 #-------------------------------------------------------
 class Recurse(Exception):
    def __init__(self,*args,**kwargs):
        self.args = args
        self.kwargs = kwargs

def recurse(*args,**kwargs):
    raise Recurse(*args,**kwargs)
        
def tail_recursive(f):
    def decorated(*args,**kwargs):
        while True:
            try:
                return f(*args,**kwargs)
            except Recurse as r:
                args = r.args
                kwargs = r.kwargs
                conTinue
    return decorated

 #-------------------------------------------------------
 # Corrected code and revised to use tail call optimization
 #-------------------------------------------------------
@tail_recursive
def solution(n):
    m = str(n)
    dig = map(int,m)
    digits = list(dig)
    sum_ = 0                         # Correction: don't use sum as a variable name since it's a built-ini
    
    for i in digits:
        if i == 0:
            sum_ += 1
        else:
            # Factorial of digit i
            factorial = 1              # Correction: Reset value to 1
            for i in range(1,i + 1):
                factorial = factorial*i
            sum_ += factorial
     
    if sum_ == n:
        return sum_
    elif sum_ != n:
        # Recursive call using recurse which provides tail call optimization
        return recurse(n + 1)        

测试

for n in range(140,150):
    print(f'n = {n},next strong number: {solution(n)}')

输出

n = 140,next strong number: 145
n = 141,next strong number: 145
n = 142,next strong number: 145
n = 143,next strong number: 145
n = 144,next strong number: 145
n = 145,next strong number: 145
n = 146,next strong number: 40585
n = 147,next strong number: 40585
n = 148,next strong number: 40585
n = 149,next strong number: 40585

大佬总结

以上是大佬教程为你收集整理的制作强数字程序时的最大递归部门错误全部内容,希望文章能够帮你解决制作强数字程序时的最大递归部门错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: