日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?

發(fā)布時間:2025/3/8 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

@bytebuster的解決方案很好,但他沒有解釋他是如何創(chuàng)建它的,所以它只會幫助解決這個特定的問題。順便說一句,你的公式看起來有點像斐波納契(但不完全),它可以是calculated analytically without any looping(即使沒有循環(huán)隱藏在Seq.unfold)。

你開始用下面的函數(shù):

let rec f0 n =

match n with

| 0 | 1 | 2 -> 1

| _ -> f0 (n - 2) + f0 (n - 3)

的函數(shù)調(diào)用f0的參數(shù)n - 2和n - 3,所以我們需要知道這些值。訣竅是使用dynamic programming(可以使用memoization完成),但由于您不想使用memoization,所以我們可以手動編寫它。

我們可以寫f1 n,它返回一個三元組元組,其當(dāng)前值和兩個過去值為f0。這意味著f1 n = (f0 (n - 2), f0 (n - 1), f0 n):

let rec f1 n =

match n with

| 0 -> (0, 0, 1)

| 1 -> (0, 1, 1)

| 2 -> (1, 1, 1)

| _ ->

// Here we call `f1 (n - 1)` so we get values

// f0 (n - 3), f0 (n - 2), f0 (n - 1)

let fm3, fm2, fm1 = (f1 (n - 1))

(fm2, fm1, fm2 + fm3)

此功能無法尾recurisve,但它只是遞歸調(diào)用自己一次,這意味著我們可以使用蓄能器參數(shù)的模式:

let f2 n =

let rec loop (fm3, fm2, fm1) n =

match n with

| 2 -> (fm3, fm2, fm1)

| _ -> loop (fm2, fm1, fm2 + fm3) (n - 1)

match n with

| 0 -> (0, 0, 1)

| 1 -> (0, 1, 1)

| n -> loop (1, 1, 1) n

我們需要處理參數(shù)0和1專門在fc的主體中。對于任何其他輸入,我們從最初的三個值(即(f0 0, f0 1, f0 2) = (1, 1, 1))開始,然后循環(huán)n次執(zhí)行給定的遞歸步驟,直到達(dá)到2為止。遞歸loop函數(shù)是@bybbuster的解決方案使用Seq.unfold實現(xiàn)的。

所以,你的函數(shù)有一個尾遞歸版本,但只是因為我們可以簡單地將過去的三個值保存在一個元組中。一般來說,如果計算出您需要的先前值的代碼做了更復(fù)雜的事情,則這可能不可行。

總結(jié)

以上是生活随笔為你收集整理的c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。