iT邦幫忙

0

[發問] Python3 要怎麼打印階乘?

Sisi 2020-11-18 19:45:172142 瀏覽
  • 分享至 

  • xImage

我是剛入門Python沒多久的菜鳥,現在遇到一個問題關於打印階乘。
需要用到兩個函數 : getFacNumList(n) , dispFacNumList(n)
要求getFacNumList(n)這邊印出1-8, dispFacNumList(n)這邊印出1-8的階乘結果。

我試過這樣:
def dispFacNumList(n):
for j in range(1, n + 1):
n = n * j
return n

def getFacNumList(n):
for i in range(1, n + 1):
print('n = {} : n! = {}\t'.format(i,dispFacNumList(n)))

def main():
n = 8
dispFacNumList(getFacNumList(n))

main()

但是出來的結果是這樣:
n = 1 : n! = 8
n = 2 : n! = 8
n = 3 : n! = 8
n = 4 : n! = 8
n = 5 : n! = 8
n = 6 : n! = 8
n = 7 : n! = 8
n = 8 : n! = 8

說是dispFacNumList(n)出了問題,請問要怎麼解決?

ccutmis iT邦高手 2 級 ‧ 2020-11-18 19:57:06 檢舉
參考看看
https://www.pythonfibonacci.com/
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
RoT
iT邦新手 5 級 ‧ 2020-11-18 20:38:08
最佳解答

Sisi, 你好

關於這段不是很清楚
要求getFacNumList(n)這邊印出1-8
以下參考看看, 是否為你要的

def getFacNumList(n):
    for j in range(1, n):
        print('n = {} : n! = {}\t'.format(j,dispFacNumList(j)))
      
def dispFacNumList(n):
    Sum = 1
    for i in range(1, n+1):
        Sum *= i
    return Sum


if __name__ == '__main__':
    n = 8
    getFacNumList(n)

歡迎討論 - RoT

看更多先前的回應...收起先前的回應...
Sisi iT邦新手 5 級 ‧ 2020-11-18 21:06:52 檢舉

謝謝!已經差不多了!!但是題目要求最後main()那裡需要引用dispFacNumList(getFacNumList(n)),我不知道要怎麼處理 for i in range(1, n+1):
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 的問題。。。

RoT iT邦新手 5 級 ‧ 2020-11-18 21:59:54 檢舉

Sisi, 你好

關於這段不是很清楚
但是題目要求最後main()那裡需要引用dispFacNumList(getFacNumList(n))

這是說我這邊會出現這個錯誤嗎?
我不知道要怎麼處理 for i in range(1, n+1): TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 的問題

歡迎討論 - RoT

Sisi iT邦新手 5 級 ‧ 2020-11-18 22:15:14 檢舉

你這段完全沒問題!!我的意思是指要是引用你這段代碼到我這的話,會有for i in range(1, n+1): TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'。 因為我需要在main()那裡同時引用 getFacNumList(n) , dispFacNumList(n)這兩個函數,即是 getFacNumList(dispFacNumList(n)) 的形式。

Sisi iT邦新手 5 級 ‧ 2020-11-18 22:16:41 檢舉

寫反了。。。是 dispFacNumList(getFacNumList(n)) 這樣。

RoT iT邦新手 5 級 ‧ 2020-11-19 00:23:28 檢舉

Sisi, 你好

由 main() 去引發 def getFacNumList(n): 函式,

再引發 def dispFacNumList(n): 計算當下 n 值的階層解,

return 回 def dispFacNumList(n):


沒有你想的這麼複雜使用

dispFacNumList(getFacNumList(n))

歡迎討論 - RoT

Sisi iT邦新手 5 級 ‧ 2020-11-21 15:49:55 檢舉

有學到了!!謝謝,不知道為什麼總是想複雜了哈哈

RoT iT邦新手 5 級 ‧ 2020-11-21 19:25:56 檢舉

Sisi, 你好

非常替你高興

歡迎討論 - RoT

2
一級屠豬士
iT邦大師 1 級 ‧ 2020-11-19 02:35:18
#!/usr/bin/env python3

def getFacNumList(n):
  s = []
  s=[s[-1] for x in range(1,n+1) if not s.append(x*s[-1] if s else 1)]
  return s

def dispFacNumList(lst):
  for i, elem in enumerate(lst):
    print('%d! = %d' % (i+1, elem))

if __name__ == '__main__':
  n = 8
  dispFacNumList(getFacNumList(n))

|=> ./ithelp201118.py 
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
看更多先前的回應...收起先前的回應...

J4(解釋)一下拉:

s=[s[-1] for x in range(1,n+1) if not s.append(x*s[-1] if s else 1)]
s[-1] 就是 s list 的最後一筆.

改成這樣,你試試看, 是不是比較好理解.

def getFacNumList(n):
  s = [1]
  s=[s[-1] for x in range(1,n+1) if not s.append(x*s[-1])]
  return s

只看得懂迴圈
/images/emoticon/emoticon20.gif

其實改成那樣 先放 1, 是不好的啦.

# 改成 + 累加
>> n = 3
>>> s = []
>>> s = [s[-1] for x in range(1,n+1) if not s.append(x+s[-1] if s else 1)]
>>> s
[1, 3, 6]
0
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-19 07:36:04

此題問答廣東話版

0
froce
iT邦大師 1 級 ‧ 2020-11-19 10:32:42
def dispFacNumList(n):
	return eval("*".join([str(i) for i in range(1, n+1)]))

def getFacNumList(n):
	print("n={0}: n!={1}".format(n, dispFacNumList(n)))

for i in range(1, 9):
	getFacNumList(i)

不用eval的話就得用math.prod或reduce了。要不然就是得用迴圈。

import math
def dispFacNumList(n):
	return math.prod([i for i in range(1, n+1)])
	
def getFacNumList(n):
	print("n={0}: n!={1}".format(n, dispFacNumList(n)))
	
for i in range(1, 9):
	getFacNumList(i)

math.prod版

我要發表回答

立即登入回答