2016-06-12 129 views
0

我写了一个函数,它将一个正整数n作为输入,并递归地返回一个阶乘值1 !, 2 !,的列表。 。 。 ,n !.功能多次打印

但是,我无法让它只打印一次。我已经尝试将打印语句放置在各种循环/位置中,并且始终打印至少3次。我也尝试过打印函数,但它返回'None',它似乎只打印如果我在函数中有打印语句。为什么是这样?

这里是我的代码:

def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
     my_list.append(n-(n-1)) 
     calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     print(my_list) 


e = 0 
x = 2 
n = int(input('Enter number: ')) 
my_list = [] 
calc_Factorial(my_list, n, x, e) 
+0

'my_list.append(n-(n-1))':是不是只有1?另外,为什么不直接使用for循环呢?我不知道为什么你需要重复一遍又一遍的功能。 – numbermaniac

+0

是的,它会一直是1,不确定为什么我这样写。这个想法是练习递归,而不是仅仅通过for循环来实现,这就是为什么它看起来很混乱。 – Perplexityy

回答

1

,因为你正在使用print递归函数内的值正在打印多次。您应该返回,而不是打印的递归函数里面。

def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
    my_list.append(n-(n-1)) 
    return calc_Factorial(my_list, n, x, e) 
    else: 
    if len(my_list) < n: 
     my_list.append(my_list[e]*x) 
     return calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     return (my_list) 


e = 0 
x = 2 
n = int(input("Enter number: ")) 
my_list = [] 
print (calc_Factorial(my_list, n, x, e)) 
1

更改打印语句return my_list

def calc_Factorial(my_list, n, x, e): 
    if not my_list: 
     my_list.append(n-(n-1)) 
     calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      calc_Factorial(my_list, n, x+1, e+1) 
    if len(my_list) == n: 
     return my_list 


>>> calc_Factorial(my_list, n, x, e) 
[1, 2, 6, 24, 120, 720, 5040] 
>>> 
1
def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
     my_list.append(n-(n-1)) 
     return calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      return calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     print(my_list) 
     return my_list 

关键问题这里是你应该return calc_Factorial(my_list, n, x+1, e+1)每次当你打电话给你recursive。如果你没有return递归,其余的代码将被最终执行。这就是为什么你看到多个print

只要你在这种情况下调用递归返回。你应该总是只看到一次打印(甚至通过你不return my_list

if len(my_list) == n: 
    print(my_list) 

但通常在递归函数,人们只是返回你想要最终值。然而,您可以使用打印服务宗旨,调试。

0

你是什么看到的是因为这部分的:

if len(my_list) < n: 
    my_list.append(my_list[e]*x) 
    calc_Factorial(my_list, n, x+1, e+1) 


if len(my_list) == n: 
    print(my_list) 

第一if语句之后,该函数将继续执行,而现在 n ==可LEN(my_list),因此将被打印的清单。 (实际上这意味着每次调用该函数都会打印一些东西)