Collat​​z猜想回文

Collatz Conjecture palindrome

我应该编写代码以 3 种不同的方式显示 collat​​z 猜想,以便使用递归进行赋值。如果你不熟悉这个想法,这个猜想表明如果你取任何起始值 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

我已经能够完成前进和后退,但回文部分让我失望了。我所有的努力,不是走在了时尚前列,就是陷入了死循环。

*重要 * 这是棘手的部分:我 不允许 声明任何局部或全局变量来帮助我解决问题。我只被允许使用 Collat​​z 方法、循环和递归的原始参数。有人有解决这个骗子的办法吗?

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按顺序打印出来

希望这能让大家更清楚发生了什么,以及如何做回文版本。