我看過溢位和交換,但我似乎無法找到答案。我目前正在嘗試制作遞回斐波那契函式。但是,當我嘗試測驗它(使用命令列條目)時,它會不斷回傳錯誤
fork: retry: Resource temporarily unavailable
我發現一個帖子說它與 shell 資源限制有關,但我覺得這可能不是我的問題,因為我已經看到了單獨的帖子,其中遞回函式能夠足夠精細地呼叫它們的函式。
我已將操作分解為多個部分,以查看究竟發生了什么,但我找不到具體的問題——這可能與我呼叫函式的方式有關,但我也不確定。
不過,我可以很好地傳遞我想要的引數。它只是為我輸入的任何數字列印相同的錯誤。如果我輸入 5,它會重復五次 fork 錯誤。它回傳,但不回傳值...
對于規范,我目前使用Bash 版本 4.4.20(1)
function fib_r
{
int=$1
for ((i=1; i<=int; i ))
do
f1=$(fib_r $((int-1)))
f2=$(fib_r $((int-2)))
fibo=$((f1 f2))
done
}
我想要實作的是當您在命令列上輸入一個數字時,它會計算該數字,但是它會在每一步顯示計算出的數字,而不是從頭到尾回傳最終值:
示例輸出:
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
uj5u.com熱心網友回復:
此Shellcheck -clean 代碼修復了問題中代碼的一些問題:
function fib_r
{
local -r n=$1
if (( n == 0 )); then
echo 0
elif (( n == 1 )); then
echo 1
else
local -r f1=$(fib_r "$((n-1))")
local -r f2=$(fib_r "$((n-2))")
echo "$((f1 f2))"
fi
return 0
}
- 它為基本情況(0 和 1)添加代碼以停止遞回。原始代碼沒有基本案例,因此遞回一直持續到資源耗盡。
- 該函式
echo是結果,因此它可供呼叫者使用。 命令替換($(command)) 通常僅在將command其結果列印到標準輸出時才有用。 - 回圈被洗掉,因為這應該是一個遞回函式(并且回圈沒有用)。
local用于使變數成為函式的區域變數,因此它們不會與使用該函式的程式中其他地方使用的變數發生沖突。使用-r(readonly) 選項是因為變數永遠不需要在函式內更改,它可以防止它們被其他函式意外更改。- 變數名稱
int被更改為,n因為這對于像這樣的函式來說更傳統(int對于了解 C 或相關編程語言的人來說似乎真的很奇怪)。
請注意,此功能非常慢。這部分是因為它使用命令替換(每次運行昂貴的子行程)來回傳結果,但主要是因為這種特定的遞回演算法效率非常低(指數復雜度,請參閱斐波那契數列的計算復雜度)。 更快的遞回實作是可能的。
該問題已更新為請求一個函式,該函式將所有斐波那契數列列印到給定數。這是一個遞回函式,它執行以下操作:
function fib_r
{
local -r n=$1
local -r depth=${2-1}
local -r f1=${3-1}
local -r f2=${4-0}
if (( depth <= n )); then
printf '- %d\n' "$depth" "$f1"
fib_r "$n" "$((depth 1))" "$((f1 f2))" "$f1"
fi
return 0
}
這使用了一種效率更高的演算法 (O(n)),因此它可以在幾分之一秒內計算出所有可以用 64 位整數表示的斐波那契數。跑去fib_r 92這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474230.html
