findStartRec(goal, count)
从初始值开始递归搜索
0 的值,并返回达到或超过目标的最小整数值。
前提条件是goal >= 0
和count > 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)
答案 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 == 0
和cur_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)。
希望这是您预期的结果。