2016-01-08 223 views
0

請幫助我理解我哪裏錯了:階乘遞歸和迭代

這是一個問題:同時創建一個遞歸函數調用recursive_factorial和迭代函數調用iterative_factorial,做以下

Accepts as parameter an Integer n 
Computes the factorial of n 
Returns the factorial of n 

這是我使用的問題測試:

import unittest 

class RecursiveTestCase(unittest.TestCase): 

    def test_recursive_factorial_one(self): 
    result = recursive_factorial(4) 
    self.assertEqual(result, 24, msg="Inaccurate value") 

    def test_recursive_factorial_two(self): 
    result = recursive_factorial(0) 
    self.assertEqual(result, 1, msg="Inaccurate value") 

    def test_iterative_factorial_one(self): 
    result = iterative_factorial(5) 
    self.assertEqual(result, 120, msg="Inaccurate value") 

    def test_iterative_factorial_two(self): 
    result = iterative_factorial(0) 
    self.assertEqual(result, 1, msg="Inaccurate value") 

這是我寫的代碼:

def recursive_factorial(n): 
    if n == 0: 
     return 1 
    else: 
     return n * recursive_factorial(n-1) 
def iterative_factorial(n): 
    x = 1 
    li = list(range(1, n + 1)) 
    for each in li: 
     x = x * each 

這是我收到的錯誤:

1。 test_iterative_factorial_one

Failure in line 21, in test_iterative_factorial_one self.assertEqual(result, 120, msg="Inaccurate value") AssertionError: Inaccurate value 

2。 test_iterative_factorial_two

Failure in line 25, in test_iterative_factorial_two self.assertEqual(result, 1, msg="Inaccurate value") AssertionError: Inaccurate value 

請幫我理解我出錯的地方。

+2

'iterative_factorial(N):'已經沒有'return' – Psytho

+0

你可以添加一些調試打印的結果'recursive_factorial(0)'。代碼看起來正確。 –

回答

4

你忘了return xiterative_factorial(),所以功能是implicitly returning None

順便說一句,你可以遍歷的range()直接結果:

for each in range(1, n + 1): 
    ... 

最後,這可能是學習Python的reduce()功能的好機會。

import operator 

def another_iterative_factorial(n): 
    return reduce(operator.mul, range(1, n + 1)) 
+0

如果你正在使用python3,reduce被移動到functools模塊。另外,您可以通過編寫'reduce(lambda x,y:x * y)函數來學習['lambda'](https://docs.python.org/2/reference/expressions.html#lambda)範圍(1,n + 1))' – Copperfield

1

iterative_factorial需要與

return x 


此外,iterative_factorial結束不需要li。最好只寫:

for each in range(1,n+1): 
+0

'test_recurisve_factorial_two'測試0!,而不是2! – Psytho

+0

D'oh!在這種情況下,我不明白。 –

+0

非常感謝你,我錯過了回報x現在它工作。 –

0
def recursive_factorial(n): 
    if n == 0: 
     return 1 
    else: 
     return n * recursive_factorial(n-1) 


def iterative_factorial(n):   
    x = 1 
    li = list(range(2, n+1)) 
    for each in li: 
     x = x*each 
     yield x 
+0

您需要修復'iterative_factorial'中'return x'語句的縮進。 – Tonechas

+0

你可以通過寫'for each in range(2,n + 1)來簡化'iterative_factorial':'' – Tonechas