2016-12-09 82 views
1

我應該編寫代碼,以3種不同的方式顯示collat​​z猜想,使用遞歸進行分配。如果你對這個想法不熟悉,那麼這個猜想就會說如果你取任何起始值n,如果n是偶數,你可以通過除以n/2得到1的值,或者如果n是奇數,則可以乘3n + 1。我應該以3種方式,前進,後退和迴文方式顯示完整的算法。Collat​​z猜想回文

例如,在向前的方式值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 
+0

這可能是強迫人們擁抱一條真正的遞歸路徑.. – Iluvatar

+0

老實說,在這種情況下,不使用局部或全局變量是有道理的。如果你想打印它,你打印這個數字,然後完成剩下的工作。如果你想回退,你可以完成剩下的工作,然後打印號碼。迴文只是做兩個。 – Kytuzian

+1

我看到他們正試圖迫使你現在做... –

回答

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的順序

希望這使得它打印出來有點更清楚這是怎麼回事,和關於如何做迴文版。

+0

這正是我不幸遺失的地方。如果數值達到1,程序將默認返回語句的頂部並結束.... – Caladin00

+0

...和其他事情正在發生 –

+1

但它沒有相當結束,這是一個事實,你在落後的情況下利用。 – Iluvatar

相關問題