Collatz猜想回文
Collatz Conjecture palindrome
我应该编写代码以 3 种不同的方式显示 collatz 猜想,以便使用递归进行赋值。如果你不熟悉这个想法,这个猜想表明如果你取任何起始值 n 你最终可以通过除以 n/2 如果 n 是偶数或乘以 3n + 1 如果 n 是奇数得到值 1 .我应该以 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
因此,正如您所了解的,将 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
函数的值,即当时的 运行 代码。
一旦达到基本情况,就可以 return 并完成函数的执行。您 'passed through' 重新获得控制权并继续执行的每个函数。在前进的情况下,什么也没发生。然而,在向后的情况下,您在递归后打印,导致类似这样的事情发生:
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
按顺序打印出来
希望这能让大家更清楚发生了什么,以及如何做回文版本。
我应该编写代码以 3 种不同的方式显示 collatz 猜想,以便使用递归进行赋值。如果你不熟悉这个想法,这个猜想表明如果你取任何起始值 n 你最终可以通过除以 n/2 如果 n 是偶数或乘以 3n + 1 如果 n 是奇数得到值 1 .我应该以 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
因此,正如您所了解的,将 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
函数的值,即当时的 运行 代码。
一旦达到基本情况,就可以 return 并完成函数的执行。您 'passed through' 重新获得控制权并继续执行的每个函数。在前进的情况下,什么也没发生。然而,在向后的情况下,您在递归后打印,导致类似这样的事情发生:
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
按顺序打印出来
希望这能让大家更清楚发生了什么,以及如何做回文版本。