2013-10-16 22 views
2

我一直在這個問題上停留了一段時間,無法想象如何解決它。在SML中創建一個迭代函數

考慮以下函數f:N→N。

F(0)= 2,F(1)= 0,F(2)= 3,

F(N)= 3F(N-3)+ 2F(N-2) - F( n-1)。

定義f的迭代版本。

我知道我的解決辦法應該是這個樣子

fun myFun 0 = 2 
| myFun 1 = 0 
| myFun 2 = 3 
| myFun n = 
     let 
     (* code *) 
     in 
     funHelp(3,2,0,n) 
     end ; 

我知道迭代功能僅想使用一個遞歸調用,同時讓論據做的所有工作。不過,我無法弄清楚如何解決這個問題。任何幫助將非常感激!

回答

0
fun funHelp 0 = (2,0,3) 
    | funHelp n = let val (x,y,z) = funHelp n - 1 
       in 
        (y,z,(3 * x) + (2 * y) - z) 
       end 

fun myFun n = let val (x,_,_) = funHelp n 
       in 
       x 
       end 

這應該做你看起來想要的,如果有點混亂。

+1

這不是一個迭代的解決方案 - 它必須是尾遞歸的。 –

2

我認爲這是家庭作業,所以我只是給你一個部分解決方案:

fun f n = 
    let 
     fun iter(0, n0, n1, n2) = n0 
     | iter(1, n0, n1, n2) = n1 
     | iter(2, n0, n1, n2) = n2 
     | iter(n, n0, n1, n2) = iter(n - 1, n1, n2, ???) 
    in 
     iter(n, 2, 0, 3) 
    end 

填補了???不應該太難。