Trong kịch bản shell làm thế nào để tìm giai thừa của một số?Làm thế nào để bạn thấy giai thừa của một số trong tập lệnh Bash?
Trả lời
Bạn phải sử dụng vòng lặp, xem liên kết này: http://ubuntuforums.org/showthread.php?t=1349272
#!/bin/bash
counter=$1 #first argument
factorial=1
while [ $counter -gt 0 ] #while counter > 0
do
factorial=$(($factorial * $counter))
counter=$(($counter - 1))
done
echo $factorial
echo 500 | dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'
10! trong bash:
f=1; for k in {1..10}; do f=$[$k * $f] ; done; echo $f
hoặc ở đây trong một từng bước thời trang:
$ t=$(echo {1..10})
$ echo $t
1 2 3 4 5 6 7 8 9 10
$ t=${t// /*}
$ echo $t
1*2*3*4*5*6*7*8*9*10
$ echo $[$t]
3628800
có giới hạn cho những gì bash có thể làm. nó phá vỡ cho số lượng lớn hơn.Có lẽ bạn có một cách để sản xuất các kết quả tương tự cho giai thừa của nói, ví dụ, 500, với bash? – ghostdog74
Tôi ổn với bất kỳ ai sử dụng các công cụ bên ngoài để tính toán những gì họ cần. Nhưng OP hỏi làm thế nào để làm điều này trong bash, vì vậy tôi figured này rất có thể là một tập thể dục trong "bash cho lập trình chung", chương "làm thế nào để lặp trong bash". –
Bạn không làm điều đó trong bash
. Người thông minh không cố gắng chặt cây bằng cá, vì vậy lời khuyên của tôi là thử và sử dụng đúng công cụ cho công việc.
Bạn có thể sử dụng, ví dụ, bc
để làm điều đó như sau:
pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
f(6)' | bc
720
pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
f(500)' | BC_LINE_LENGTH=99999 bc
12201368259911100687
45373153881997605496447502203281863013616477148203584163378722078177
20048078520515932928547790757193933060377296085908627042917454788242
49127263443056701732707694610628023104526442188787894657547771498634
94367781037644274033827365397471386477878495438489595537537990423241
06127132698432774571554630997720278101456108118837370953101635632443
29870295638966289116589747695720879269288712817800702651745077684107
19624390394322536422605234945850129918571501248706961568141625359056
69342381300885624924689156412677565448188650659384795177536089400574
52389403357984763639449053130623237490664450488246650759467358620746
37925184200459369692981022263971952597190945217823331756934581508552
33282076282002340262690789834245171200620771464097945611612762914595
12372299133401695523638509428855920187274337951730145863575708283557
80158735432768888680120399882384702151467605445407663535984174430480
12893831389688163948746965881750450692636533817505547812864000000000
00000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000
Đồng ý. OTOH Tôi đã tìm thấy bản thân mình một thời gian trong một khu rừng với một cái búa, một con dao bơ và busybox. Vì vậy, điều này nên được gắn thẻ là "đào tạo sự sống còn" –
seq -s "*" 1 500 |bc
Và btw. điều này không hoạt động trên Mac OSX hoặc bất kỳ hệ thống nào khác không đi kèm với lõi của GNU (mà seq là một phần của) –
sau đó sử dụng jot trên Mac OS. Nếu có hệ thống nào khác – ghostdog74
Dưới đây là một hàm đệ quy trong Bash:
factorial() {
if (($1 == 1))
then
echo 1
return
else
echo $(($(factorial $(($1 - 1))) * $1))
fi
}
Tất nhiên nó khá chậm và hạn chế.
Có một số ví dụ hướng dẫn on Rosetta Code.
Dưới đây là một tôi thấy đặc biệt hữu ích:
function factorial {
typeset n=$1
((n < 2)) && echo 1 && return
echo $((n * $(factorial $((n-1)))))
}
Tôi gần như hoàn toàn đồng ý với Vitalii Fedorenko, tôi sẽ giống như paxdiablo gợi ý sử dụng bc
, đây là mã từ Vitalii Fedorenko nhưng sửa đổi để sử dụng bc
.
#!/bin/bash
counter=$1
output=1
while [ $counter -gt 1 ] #while counter > 1 (x*1=x)
do
output=$(echo "$output * $counter" | bc)
counter=$(($counter - 1))
done
#remove newlines and '\' from output
output=$(echo "$output" | tr -d '\' | tr -d '\n')
echo "$output"
exit
Phương pháp này là tốt hơn bởi vì bc
cho phép bạn sử dụng chuỗi, thay vì số nguyên, làm cho nó có thể cho bạn để tính toán số lớn hơn nhiều.
Tôi xin lỗi nếu tôi không sử dụng chính xác tr
, tôi không quen thuộc lắm.
seq -s* `dd`|bc
Tôi tin rằng đây là cách ngắn nhất để hoàn thành tác vụ.
Bạn có thể sử dụng:
seq -s "*" 1 10 | sed 's/*$//g' |bc
trên mac
- 1. Làm thế nào để bạn thực hiện SQL từ bên trong một tập lệnh bash?
- 2. Làm thế nào để tính toán giai thừa nghịch đảo của một số thực?
- 3. Trong Bash, làm thế nào để bạn thấy nếu một chuỗi không nằm trong một mảng?
- 4. Hàm lambda Python để tính giai thừa của một số
- 5. Làm thế nào để chạy một lệnh trước khi một tập lệnh Bash thoát?
- 6. Trong Bash, làm thế nào để bạn truy cập các đối số dòng lệnh bên trong một hàm?
- 7. Python: Tính giai thừa của một số không tách rời
- 8. Làm thế nào để bạn leo lên cấu trúc thư mục cha của một tập lệnh bash?
- 9. Làm thế nào để làm lũy thừa trong bash
- 10. Làm thế nào để cho phép bash subshell thừa kế các tùy chọn của cha mẹ?
- 11. Làm thế nào để chuyển các tham số từ bash sang tập lệnh php?
- 12. Vợt - làm thế nào để có được "lệnh được thực thi trước" trong tập lệnh bash?
- 13. bash: truyền đối số tập lệnh
- 14. Làm thế nào để bạn gõ một tab trong một bash ở đây-tài liệu?
- 15. Bạn có nên bẫy SIGPIPE trong tập lệnh bash không?
- 16. Chạy một số tập lệnh trong tập lệnh bash song song
- 17. Làm thế nào để chuyển các tham số cho kịch bản lệnh Bash của Linux?
- 18. Tính giai thừa của một số lớn tùy ý, hiển thị tất cả các số
- 19. Dự đoán tràn giai thừa
- 20. Euler 160: Tìm 5 số không nhỏ của giai thừa
- 21. Làm cách nào để gửi tín hiệu SIGINT từ tập lệnh đến tập lệnh? BASH
- 22. Làm cách nào để bạn quay lại tập lệnh bash có nguồn gốc?
- 23. Làm thế nào để bạn kế thừa StringBuilder trong vb.net?
- 24. Tính giai thừa lớn trong C++
- 25. Sử dụng "màn hình thay thế" trong tập lệnh bash
- 26. Làm thế nào để bạn thực hiện một lệnh trên hệ thống từ xa để chèn mã BASH?
- 27. Tệp nguồn trong tập lệnh bash
- 28. Làm cách nào để tạo tập lệnh bash có đối số?
- 29. Làm thế nào để bạn chọn tên tập tin của một maven jar-với-phụ thuộc?
- 30. Làm thế nào để cung cấp mật khẩu cho một lệnh nhắc nhở một trong bash?
1 tốt đẹp, mặc dù tôi không có đầu mối tại sao nó hoạt động;) –
này sử dụng một chương trình bên ngoài với một cú pháp phức tạp để thực hiện các phép tính. –
@ luther, các công cụ chuyên dụng bên ngoài như bc, dc có thể tính số lớn hơn. Vì vậy, họ là công cụ thích hợp nhất cho công việc. Có giới hạn cho những gì bash có thể tính toán cho giai thừa lớn hơn. – ghostdog74