归藏第九
赋曰
江河赴海,叶落归根;术行至简处,亦须知止。递归者,自召其名也。貌若回环,实每进一阶:数递减,列渐短,树趋空。既有归处,则层层收束;若无止境,则调用相仍,栈深而机困。故递归之道,一曰基,一曰进;基定其终,进近于基。
豫言之顶层术,欲自见其名,先悬类型之契。契在前,则定义虽未尽,编译器已知其所当为;术中召己,不致迷名。若递归只供一隅,不欲昭告全篇,则以 递归虑 纳之;写其名,著其类型,陈其定义,末在 而 后用之。或显于堂,或藏于室,所循同理。
解章
顶层递归之术,须先声明其类。阶乘曰:
「阶乘」乃化「整数」而「整数」也。
「阶乘」者会「数」而
若「等」于「数」于「零」
则「一」
否则「乘」于「数」于(「阶乘」于(「减」于「数」于「一」))也。
数为零者,返一,是其基也;否则化为数减一之较小问,是其进也。全篇曰:
寻观「标准库」之书。
「阶乘」乃化「整数」而「整数」也。
「阶乘」者会「数」而
若「等」于「数」于「零」
则「一」
否则「乘」于「数」于(「阶乘」于(「减」于「数」于「一」))也。
「打印行」于(「整数表示」于(「阶乘」于「六」))。
其出七百二十。同例见归藏。豫。
藏递归于句
递归但供一式者,可不列之篇首,而用 递归虑:
递归虑「求零」其化「整数」而「整数」者
会「数」而
若「等」于「数」于「零」
则「零」
否则「求零」于(「减」于「数」于「一」)
而
「求零」于「三」
其 后著递归值之类,者 后陈其定义,末一 而 后乃用之。局部递归可取外层之绑定,宜为一术私有之辅算。
终止之问
类型无误,未必终有所得。编译器能验参果之类,而未必能证每次自召皆近于基。故作递归,当先自问三端:何形为基?每召所减者何?凡合法之入,必能至其基乎?
阶乘若受负数,则递减而远于零。故又当定其输入之疆:或入术先验而生异常,或自制惟能表非负之类。善作递归者,不惟书其回环,亦明其所许也。
试策
作 「幂」,受底数与非负指数;指数为零则一,否则返底数乘指数减一时之幂。复以局部递归改写之,使辅术不显于篇外。