?? q-function.sh
字號:
#!/bin/bash# Douglas Hofstadter的聲名狼藉的序列"Q-series":# Q(1) = Q(2) = 1# Q(n) = Q(n - Q(n-1)) + Q(n - Q(n-2)), 當n>2時# 這是一個令人感到陌生的, 沒有規律的"亂序"整數序列. # 序列的頭20項, 如下所示: # 1 1 2 3 3 4 5 5 6 6 6 8 8 8 10 9 10 11 11 12 # 請參考相關書籍, Hofstadter的, "_Goedel, Escher, Bach: An Eternal Golden Braid_",#+ 第137頁. LIMIT=100 # 需要計算的數列長度. LINEWIDTH=20 # 每行打印的個數. Q[1]=1 # 數列的頭兩項都為1. Q[2]=1echoecho "Q-series [$LIMIT terms]:"echo -n "${Q[1]} " # 輸出數列頭兩項. echo -n "${Q[2]} "for ((n=3; n <= $LIMIT; n++)) # C風格的循環條件. do # Q[n] = Q[n - Q[n-1]] + Q[n - Q[n-2]] 當n>2時# 需要將表達式拆開, 分步計算, #+ 因為Bash不能夠很好的處理復雜數組的算術運算. let "n1 = $n - 1" # n-1 let "n2 = $n - 2" # n-2 t0=`expr $n - ${Q[n1]}` # n - Q[n-1] t1=`expr $n - ${Q[n2]}` # n - Q[n-2] T0=${Q[t0]} # Q[n - Q[n-1]] T1=${Q[t1]} # Q[n - Q[n-2]]Q[n]=`expr $T0 + $T1` # Q[n - Q[n-1]] + Q[n - Q[n-2]]echo -n "${Q[n]} "if [ `expr $n % $LINEWIDTH` -eq 0 ] # 格式化輸出. then # ^ 取模操作 echo # 把每行都拆為20個數字的小塊. fidoneechoexit 0# 這是Q-series的一個迭代實現. # 更直接明了的實現是使用遞歸, 請讀者作為練習完成. # 警告: 使用遞歸的方法來計算這個數列的話, 會花費非常長的時間.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -