递归查找基本序列

时间:2018-09-21 19:26:32

标签: python python-3.x recursion

findStartRec(goal, count)从初始值开始递归搜索 0 的值,并返回达到或超过目标的最小整数值。

前提条件是goal >= 0count > 0。如果从0开始的双精度(x * 2)和加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)

2 个答案:

答案 0 :(得分:1)

这显然是硬件问题,所以我将对此进行详尽的解释。我建议OP或其他有兴趣的人士认真阅读这篇文章,如果他们真的想成为一名专业的程序员和/或计算机科学家。 TLDR人员可以跳到最后一部分以查看最终的解决方案。在解决此问题时,我将带您逐步完成我的思考过程,希望您以后可以学习如何解决递归问题。

定义基本情况

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

  

继续此过程,直到程序找到起始值'N'   在计数步骤中达到或超过目标并返回该起点   值。

发生这种情况时,您需要从开始序列的任何地方返回。这是基本情况:

if sequence >= goal: # base case, return start when we reach or exceed the goal                                                                                                                                                    
    return start

请注意,函数接口没有start值。我们将添加该内容,这将使我进入下一步,即递归帮助器功能。递归的一个常见模式是创建一个辅助函数,因为我们想通过递归调用传递额外的参数,但是我们不想更改原始接口。所以我们想要这样的东西:

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

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

定义递归案例

我们需要考虑两种不同的情况。

  

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

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

  

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

请注意,我们还必须跟踪原始的计数,因此我们知道从哪里开始。这意味着我们需要在辅助函数中添加另一个变量,并且我们将2重命名为count以避免混淆。 cur_count将在每次递归调用时递减,而cur_count只是一个不变式,它等于传递给original_count的原始count(但是我们仍然需要一些方法跟踪它。

2)第二种情况自然是当count不等于0时。这意味着我们需要递归地为序列中的下一个值调用辅助函数。因此,我们将做这个问题所暗示的findStartRec事情。这也有子案例,但是直到我们到达那里时,我们才不必担心。

定义第一个递归情况:

x * 2 + 5就是这种情况。注意,我在接口中添加了两个参数cur_count == 0cur_count。所以现在我们的解决方案看起来像这样:

original_count

这就是递归的含义:它是一个自我调用的函数。 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_count == original_count为0。第二个子情况是sequence,因此cur_count != original_count应该由我们的上一个递归调用定义。此外,由于我们刚刚更新了sequence,因此我们需要将cur_count减1。因此,我们将写下两种情况来修改sequence

sequence

将它们放在一起:

最终解决方案:

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))

根据需要。

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

答案 1 :(得分:0)

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

希望这是您预期的结果。