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来说也是如此;你可能想要一个“如果”。我已经更新了我的问题,这样我的任务就更全面了。