Collat​​z Conjecture回文

时间:2016-12-09 00:02:48

标签: python recursion palindrome collatz

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

我已经能够完成向前和向后完成但是回文部分正在让我滑倒。我所有的努力都表现出了前瞻性的方式,或者让我陷入无限循环。

*重要* 以下是棘手的部分:我 不允许 声明任何本地或全局变量帮我解决这个问题。我只允许使用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 

1 个答案:

答案 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按顺序打印

希望这能让我们更清楚地知道发生了什么,以及如何做回文版本。