【问题标题】:Python recursive function returns result for one input, but None for anotherPython递归函数返回一个输入的结果,但没有另一个输入
【发布时间】:2018-06-30 04:41:28
【问题描述】:

我正在尝试计算 ??????????模数??? (fibonacci modulo m) 使用这两个函数。第一个输入返回结果,而第二个输入返回 None。我真的很困惑这有什么问题:

def get_period(n,m):
    # calculate period of m using fibonacci series
    modular_list=[]
    for idx,element in enumerate(fib_series(n)[0]):
        modular_list.append(element%m)
        for i in range(len(modular_list)-1):
            if modular_list[i]==0 and modular_list[i+1]==1:
                if i>1:
                    period = idx-1
                    modular_list_period = modular_list[:-2]
                    return(period, modular_list_period)
                else:
                    continue

def fib_series(n):
    lst = [0,1]
    for i in range(n):
        if n>=1:
            lst.append(lst[-1]+lst[-2])
        else:
            return 0
    return lst[:-1], lst[-2]

print(get_period(2015,3)) # returns -> (8, [0, 1, 1, 2, 0, 2, 2, 1])
print(get_period(239,1000)) # returns -> None

【问题讨论】:

  • 当您看到这种情况发生时,并且您在某处没有return None,这意味着您的函数正在完成而没有明确的return(所有循环都结束了,您永远不会满意if 您将返回的条件)。
  • 它没有发生,因为你是第二次执行它;但是因为它是以您定义它的方式执行的。用它迭代,你会找到原因。

标签: python recursion fibonacci


【解决方案1】:

您的代码中有逻辑错误。您的get_period 函数完成了它的执行,而没有为第二个输入返回任何值。这就是为什么它的打印默认返回值None。看看这个更新的代码:

def get_period(n,m):
    # calculate period of m using fibonacci series
    modular_list=[]
    for idx,element in enumerate(fib_series(n)[0]):
        modular_list.append(element%m)
        for i in range(len(modular_list)-1):
            if modular_list[i]==0 and modular_list[i+1]==1:
                if i>1:
                    period = idx-1
                    modular_list_period = modular_list[:-2]
                    return(period, modular_list_period) #for the second command this return is not getting executed,try to check value of i and len(modular_list)
                else:
                    continue
    return  modular_list  #updated return statement. previous loop doesn't returns the value the return from here
def fib_series(n):
    lst = [0,1]
    for i in range(n):
        if n>=1:
            lst.append(lst[-1]+lst[-2])
        else:
            return 0

    return lst[:-1], lst[-2]

print(get_period(2015,3)) # returns -> (8, [0, 1, 1, 2, 0, 2, 2, 1])
print(get_period(239,1000))

【讨论】:

  • 请用文字解释错误是什么以及您为修复它做了什么。 SO 不是解决 OP 的迫切需求,而是帮助未来有类似问题的访问者的网站。
【解决方案2】:

使用您的代码以及 this page 上的图表,周期为 1500。您将返回 None,因为您没有将 n 设置得足够高。将 239 替换为大于 1500 的整数,您将看到所需的输出(此处过于庞大,无法粘贴)。

试试,例如,

print(get_period(2390,1000))

改为。

【讨论】:

    【解决方案3】:

    print(get_period(100,44))#你必须为m传递更少的值, print(get_period(239,90))#这样,m值应该小于n。

    【讨论】:

    • 不,根本不是这样。 1000的周期是1500,而1001的周期是560。运行print(get_period(561,1001))会产生输出。
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2018-05-29
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多