我应该编写代码,以3种不同的方式显示使用递归进行赋值的collatz猜想。如果你不熟悉这个想法,猜想说明如果你取任何起始值n你可以通过除以n / 2得到1的值,如果n是偶数或乘以3n + 1,如果n是奇数。我应该以3种方式展示完整的算法,前进,后退和回文方式。
例如,正向方式的值32将显示:32 16 8 4 2 1
向后方式的值32将显示1 2 4 8 16 32
最后,回文方式将显示32 16 8 4 2 1 2 4 8 16 32
我已经能够完成向前和向后完成但是回文部分正在让我滑倒。我所有的努力都表现出了前瞻性的方式,或者让我陷入无限循环。
*重要* 以下是棘手的部分:我 不允许 声明任何本地或全局变量帮我解决这个问题。我只允许使用Collatz方法,循环和递归的原始参数。有没有人有这个骗子的解决方案?
def Collatz(number , algorithm):
if number == 1:
print number
return
if algorithm == 'F':
if number % 2 == 1:
print number
Collatz((3*number) + 1, algorithm)
if number % 2 == 0:
print number
Collatz((number/2),algorithm)
if algorithm == 'B':
if number % 2 == 1:
Collatz((3*number) + 1, algorithm)
print number
if number % 2 == 0:
Collatz((number/2),algorithm)
print number
**if( algorithm == 'P'):**
m = input( "Enter a positive integer value: " )
displaymode = '' # initialize to anything not F, B, P
while displaymode not in ['F', 'B', 'P']:
displaymode = raw_input( "Choose a display mode: F=forward, B=backward, P=palindrome: " )
Collatz( m, displaymode )
print
答案 0 :(得分:1)
因此,正如您已经想到的那样,在递归步骤之前放置print
语句会显示前向案例。并且在递归步骤之后放置print
语句显示了后向大小写。现在你将如何展示回文案例,它显示了前进步骤然后是后退步骤...
要继续,您在前进案例中所做的是不断调用Collatz
。每次执行此操作时,您将获得序列中的下一个数字,并且您将进入递归级别。你在下降之前打印出来的数字,因此你会得到这样的结果:
time -->
number=8
| \
| number=4
| | \
| | number=2
| | | \
| | | number=1 (base case)
| | | |
8 4 2 1 (what's printed out)
8 4 2 1
按顺序打印
在此图中,向下表示递归更深层。每个垂直切片显示当时正在运行代码的Collatz
函数的值。
一旦到达基本案例,然后返回,并完成执行功能。您通过的每个功能都会重新获得控制并继续执行。在前瞻性案件中,没有任何反应。然而,在后面的情况下,你在递归之后打印,导致发生这样的事情:
number=8 number=8
\ (n=8) waiting for Collatz... / |
number=4 number=4 |
\ (n=4) waiting... / | |
number=2 number=2 | |
\ ... / | | |
number=1 | | |
| | | |
1 2 4 8 (what's printed out)
1 2 4 8
按顺序打印
希望这能让我们更清楚地知道发生了什么,以及如何做回文版本。