Python 递归查找基序列

Python 递归查找基序列,python,python-3.x,recursion,Python,Python 3.x,Recursion,findStartRec(目标,计数)从初始值递归向前搜索 ,并返回达到或超过目标的最小整数值 先决条件是goal>=0和count>0。如果从0开始的double(x*2)和add 5(+5)序列无法达到count步骤中的目标,则尝试从1开始 继续此过程,直到程序在计数步骤中找到确实达到或超过目标的起始值“N”,然后返回该起始值 例如: findStartRec(100,3) 返回'9' 以下是我到目前为止的想法 def findStartRec(goal, count, sequence=0

findStartRec(目标,计数)
从初始值递归向前搜索 ,并返回达到或超过目标的最小整数值

先决条件是
goal>=0
count>0
。如果从0开始的double(x*2)和add 5(+5)序列无法达到
count
步骤中的目标,则尝试从1开始

继续此过程,直到程序在计数步骤中找到确实达到或超过目标的起始值“N”,然后返回该起始值

例如:

findStartRec(100,3) 返回'9'

以下是我到目前为止的想法

def findStartRec(goal, count, sequence=0, itter=0):
    if sequence == goal and count == 0:
        print("Sequence: ", sequence, "Itter: ", itter)
        return sequence, itter
    else:
        while count > 0:
            sequence = (itter * 2) + 5
            count = count + 1
            #return findStartRec(goal, count + 1, sequence, itter)
        else:
            return findStartRec(goal, count, sequence, itter + 1)

我不太确定预期结果应该是什么,但在FindStartRec函数的第2行,将“&”改为“and”,将结果从0,0(0,0)改为(100,4,5,0)


希望这是你期望的结果

这显然是一个硬件问题,因此我将以迂腐的方式对此进行解释。如果OP或其他感兴趣的人真的想成为一名专业程序员和/或计算机科学家,我建议他们阅读本文。TLDR人员可以跳到最后一部分查看最终解决方案。我将在解决此问题时向您介绍我的思考过程,希望您将来可以学习如何处理递归

定义基本情况 您采取了正确的第一步,即首先定义基本情况。不幸的是,你没有完全正确。基本情况是当我们达到或超过目标时(即当我们的序列达到或超过目标时)。我怎么知道的?它在问题陈述中这样说:

继续此过程,直到程序找到起始值“N” 在计数步骤中达到或超过目标,并返回该开始 价值观

发生这种情况时,您需要返回序列开始的位置。以下是基本情况:

if sequence >= goal: # base case, return start when we reach or exceed the goal                                                                                                                                                    
    return start
请注意函数界面如何没有
start
值。我们想添加这一点,这就引出了下一点,即递归辅助函数。递归中的一种常见模式是创建一个helper函数,因为我们希望通过递归调用传递额外的参数,但不希望更改原始接口。所以我们想要这样的东西:

def findStartRec(goal, count):
    return findStartRecHelper(goal, count, start=0)

def findStartRecHelper(goal, count, start):
    if sequence >= goal: # base case (no recursion)                                                                                                                                                     
        return start
def findStartRec(goal, count):
    return findStartRecHelper(goal, cur_count=count, original_count=count, start=0, sequence=0)

def findStartRecHelper(goal, cur_count, original_count, start, sequence):
    if sequence >= goal: # base case (no recursion)                                                                                                                                                     
        return start
    elif cur_count == 0:
        # Didn't reach the goal, but ran out of tries. Increment the start (N) and restart                                                                                                          
        return findStartRecHelper(goal=goal, # invariant                                                                                                                                            
                                  cur_count=original_count, # Restart at original_count                                                                                                         
                                  original_count=original_count, # invariant                                                                                                                        
                                  start=start+1, # try the next start                                                                                                                               
                                  sequence=0) # restart sequence at 0
定义递归案例 我们需要考虑两种不同的情况。

如果从0开始的双精度(x*2)和加法5(+5)序列不能 以计数步数达到目标,然后尝试从1开始

1) 第一种情况是当我们当前的
计数达到0时。如果达到0,则必须尝试从
1
开始,如果失败,则尝试从
2
开始,并不断重复,直到找到达到或超过目标的值

继续此过程,直到程序找到起始值

请注意,我们还必须跟踪原始计数,以便知道从何处重新开始。这意味着在helper函数中需要另一个变量,我们将
count
重命名为
cur\u count
,以避免混淆
cur\u count
将在每次递归调用中递减,而
original\u count
将只是一个不变量,它等于传递给
findStartRec
的原始
count
(但我们仍然需要某种方法来跟踪它)

2) 第二种情况自然是计数不等于0。这意味着我们需要为序列中的下一个值递归调用helper函数。所以我们将做这个问题提到的
x*2+5
事情。这也有子类,但是在我们到达之前不要担心它

定义第一个递归案例: 这种情况下,
cur\u count==0
。注意,我在接口中添加了两个参数,
cur\u count
original\u count
。现在我们的解决方案如下所示:

def findStartRec(goal, count):
    return findStartRecHelper(goal, count, start=0)

def findStartRecHelper(goal, count, start):
    if sequence >= goal: # base case (no recursion)                                                                                                                                                     
        return start
def findStartRec(goal, count):
    return findStartRecHelper(goal, cur_count=count, original_count=count, start=0, sequence=0)

def findStartRecHelper(goal, cur_count, original_count, start, sequence):
    if sequence >= goal: # base case (no recursion)                                                                                                                                                     
        return start
    elif cur_count == 0:
        # Didn't reach the goal, but ran out of tries. Increment the start (N) and restart                                                                                                          
        return findStartRecHelper(goal=goal, # invariant                                                                                                                                            
                                  cur_count=original_count, # Restart at original_count                                                                                                         
                                  original_count=original_count, # invariant                                                                                                                        
                                  start=start+1, # try the next start                                                                                                                               
                                  sequence=0) # restart sequence at 0
这就是递归的含义:它是一个调用自身的函数
findStartRecHelper
现在正在调用自身。请注意,在您的原始帖子中,您没有递归…

定义第二个递归案例 第二个案例中有两个子类。第一个子类是当
cur\u count==original\u count
时。这意味着我们正在跟踪的
序列是0。第二个子类是当
cur\u count!=原始计数
,因此,
序列
应该由我们前面的递归调用定义。此外,我们需要将
cur\u计数减少1,因为我们刚刚更新了
序列。因此,我们将写下修改
序列的这两种情况:

if cur_count == original_count:
    # Sequence is 0, so use start * 2 + 5                                                                                                                                               
    sequence = start * 2 + 5
else:
    # Sequence is not 0                                                                                                                                                                 
    sequence = sequence * 2 + 5
# Return the next iteration                                                                                                                                                                 
return findStartRecHelper(goal=goal, # invariant
                          cur_count=cur_count-1, # Note we've decremented by 1
                          original_count=original_count, # invariant
                          start=start,
                          sequence=sequence)
总而言之: 最终解决方案:

def findStartRec(goal, count):
    return findStartRecHelper(goal, cur_count=count, original_count=count, start=0, sequence=0)

def findStartRecHelper(goal, cur_count, original_count, start, sequence):
    if sequence >= goal: # base case (no recursion)                                                                                                                                                     
        return start
    elif cur_count == 0:
        # Didn't reach the goal, but ran out of tries. Increment the start (N) and restart                                                                                                          
        return findStartRecHelper(goal=goal, # invariant                                                                                                                                            
                                  cur_count=original_count, # Restart at original_count                                                                                                             
                                  original_count=original_count, # invariant                                                                                                                        
                                  start=start+1, # try the next start                                                                                                                               
                                  sequence=0) # restart sequence at 0                                                                                                                               
    else:
        if cur_count == original_count:
            # Sequence is 0, so use start * 2 + 5                                                                                                                                               
            sequence = start * 2 + 5
        else:
            # Sequence is not 0                                                                                                                                                                 
            sequence = sequence * 2 + 5
        # Return the next iteration                                                                                                                                                                 
        return findStartRecHelper(goal=goal, # invariant                                                                                                                                            
                                  cur_count=cur_count-1, # Note we decrement by one                                                                                                                 
                                  original_count=original_count, # invariant                                                                                                                        
                                  start=start,  
                                  sequence=sequence)

print("Result: ", findStartRec(100, 3))
这将产生:

Result: 9
如所愿


HTH当前问题和您未来的研究。

这两种功能是如何导致
9
?第一个函数将
205415835
作为其序列输出,将
100,3
作为参数输出。请回答您的问题,以澄清您正在尝试执行的操作。您确定要使用
&
,而不是
?有几件东西坏了。你的意思可能是“和”你写的地方“&”。在findStartReq的最后两次返回中,您可能会错过findStartRec()。无条件返回的“while”是很奇怪的,同样的,对于一个没有休息的else来说也是如此;你可能想要一个“如果”。我已经更新了我的问题,这样我的任务就更全面了。