關於Python 函式遞迴中的 sin之舞

2021-10-10 07:27:18 字數 1552 閱讀 7450

最近fj為他的奶牛們開設了數學分析課,fj知道若要學好這門課,必須有乙個好的三角函式基本功。所以他準備和奶牛們做乙個「sine之舞」的遊戲,寓教於樂,提高奶牛們的計算能力。

不妨設:

an=sin(1–sin(2+sin(3–sin(4+…sin(n))…)

sn=(…(a1+n)a2+n-1)a3+…+2)an+1

fj想讓奶牛們計算sn的值,請你幫助fj列印出sn的完整表示式,以方便奶牛們做題。

問題明顯是兩個部分,由an和sn組成,而且sn是由an和其他部分組成。

觀察兩個表示式,發現它們可以的組成含有一定的規律,開始考慮函式遞迴的思路,找到遞迴出口和遞迴規律。

先看sn部分,將sn的表示式進行翻轉,然後將由+號連線的部分看作為一項,可以發現每一項都可以由乙個通項公式——「aj +(n + 1 - j)」表示,這個規律也就是遞迴的通項公式,而且遞迴出口也就是當j等於n時,也就是翻轉後的sn的第一項;

再看an部分,從後往前看,可以發現「i +(-1)i * sin()」構成了它前一項的sin內的值,且最後一項為sin(n),這樣an的遞迴規律也就找到了,同時,遞迴出口也很容易發現:當i等於n的時候,也就是最後一項sin(n)。

python**:

def

an(i,n)

:#求an表示式的函式,

if i==n:

#遞迴出口,最後一項

return

'sin'

+'('

+str

(n)+

')'else

:return

'sin'

+'('

+str

(i)+

'+'+

str((-

1)**i)

+str

(an(i+

1,n))+

')'#連線通項公式,開始遞迴

defsn

(n,j)

:#求sn表示式的函式

if j==n:

#遞迴出口,翻轉後sn的第一項

return

str(n)

+'+'

+str

(an(1,

1))else

:return

str(j)

+'+'

+str

(an(

1,n+

1-j))+

'('+

str(sn(n,j+1)

)+')'#開始遞迴,需要將an()放入遞迴中

當完成上述函式遞迴後,假設需要求s3的表示式,會得到這樣的結果:1+sin(1±1sin(2+1sin(3)))(2+sin(1±1sin(2))(3+sin(1))),這個結果雖然是正確的,但是出現乙個問題,那就是負號出現時正號也會出現,也就還需要一些調整,注意得到的sn是乙個字串,那麼問題也就變得簡單了,只需要遍歷這個字串,如果出現正負號同時存在的情況,便將負號刪除。

同時通過這個遞迴的簡單應用,可以發現遞迴的一般思路步驟:首先分析問題,找到遞迴規律,然後找到遞迴出口,最後分析遞迴開始的條件和位置,完成遞迴。

end

python在遞迴中的坑

用python寫遞迴方法解決八皇后問題時,出現了很多問題 遞迴中的return只會退出當前呼叫的函式f tf t ft 如果僅在f tf t ft 中return了,那麼程式不會直接退出整個遞迴呼叫,而是返回到上乙個呼叫函式ft 1f ft 1 繼續執行ft 1f ft 1 中沒有執行完的部分,所以...

遞迴中關於遞迴語句後面內容的執行

遞迴函式中,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反 下面看乙個經典的例子 include void up and down int int main void void up and down int n 輸出結果 level 1 n location 0240ff48 lev...

關於Python函式遞迴深度的問題

最近在做python函式練習的時候出現了乙個問題,遞迴超過997時python直譯器會報錯,具體 如下 def fact n if n 0 return 1 else return n fact n 1 print fact 998 報錯截圖 修改後問題解決,setrecursionlimit的引數...