Metapost 如何在递归函数中返回值?

Metapost 如何在递归函数中返回值?

我正在尝试编写 B 样条的递归定义,但我无法编写递归,我的代码无法编译,因为我试图将“vacuous 分配给numeric”,

根据在线资源,要返回一个值,您需要省略末尾的分号。

但是这不能编译:

vardef calculate_basis(expr t, i, order)= 
    numeric ret;
    if order=0:
        index := knots[i];
        if (t >= index) and (t < knots[i+1]):
            label.top(textext("\huge$"& decimal(70) &"$"), (0,0));
            ret := 1
        else:
            ret := 0
        fi;
    else:
        (t-knots[i]) / (knots[i] + order - knots[i]) * calculate_basis(t, i, order-1) + (knots[i + order + 1] - t) / (knots[i + order + 1] - knots[i+1] * calculate_basis(t, i+1, order-1))
    fi;
    ret := 0
enddef;

% Start figure
beginfig(0);

make_knots(3, 7);

val = calculate_basis(0.5, 1, 0);
endfig;

但是将最后一行改为calculate_basis(0.5, 1, 0);,即消除分配,确实可以正常运行。

我究竟做错了什么?

答案1

ret您应该在宏的末尾添加vardef,以便它获取变量的值ret

vardef calculate_basis(expr t, i, order)= 
    numeric ret;
    if order=0:
        index := knots[i];
        if (t >= index) and (t < knots[i+1]):
            label.top(textext("\huge$"& decimal(70) &"$"), (0,0));
            ret := 1
        else:
            ret := 0
        fi;
    else:
        (t-knots[i]) / (knots[i] + order - knots[i]) * calculate_basis(t, i, order-1) + (knots[i + order + 1] - t) / (knots[i + order + 1] - knots[i+1] * calculate_basis(t, i+1, order-1))
    fi;
    ret := 0;
    ret % new line here!
enddef;

相关内容