Functional programming 在SML中创建迭代函数

Functional programming 在SML中创建迭代函数,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我已经在这个问题上纠缠了一段时间,想不出如何解决它 考虑以下函数f:N→ N f(0)=2,f(1)=0,f(2)=3 f(n)=3f(n-3)+2f(n-2)-f(n-1)表示n≥3. 定义f的迭代版本 我知道我的解决方案应该是这样的 fun myFun 0 = 2 | myFun 1 = 0 | myFun 2 = 3 | myFun n = let (* code *) in funHelp(3,2,0,n)

我已经在这个问题上纠缠了一段时间,想不出如何解决它

考虑以下函数f:N→ N

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

f(n)=3f(n-3)+2f(n-2)-f(n-1)表示n≥3.

定义f的迭代版本

我知道我的解决方案应该是这样的

fun myFun 0 = 2
|   myFun 1 = 0
|   myFun 2 = 3
|   myFun n = 
       let
        (* code *)
       in
         funHelp(3,2,0,n)
       end ;
我知道迭代函数假设只使用一个递归调用,而让参数完成所有工作。不过,我不知道如何解决这个问题!任何帮助都将不胜感激

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

这应该是你想要的,如果有点混乱的话。

我想这是家庭作业,所以我给你一个部分解决方案:

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

填写表格???不应该太难。

这不是一个迭代解决方案——它必须是尾部递归的。