m ← ##.m91 n ⍝ McCarthy's M91 function.
The McCarthy 91 function is a recursive function, defined by John McCarthy as a
test case for formal verification within computer science.
http://en.wikipedia.org/wiki/McCarthy_91_function
The recursive definition:
M n → n-10, if n>100
M n → M(M(n+11)), otherwise
is nicely expressed as a dfn:
m91←{ ⍝ non-tracing version
⍵>100: ⍵-10 ⍝ high number: M(n) → n-10
∇ ∇ ⍵+11 ⍝ low number: M(n) → M(M(n+11))
}
We can watch the progress of the sequence by displaying the value of ⍵ at the
start of each function invocation and passing, as left argument, which of the
recursive calls was used:
m91←{ ⍝ McCarthy's M91 function.
⍺←'' ⋄ ⍞←⍺,⍕⍵ ⍝ trace:
⍵>100:⍵-10 ⍝ high number: M(n) → n-10
')'∇'('∇ ⍵+11 ⍝ low number: M(n) → M(M(n+11))
}
Then:
m91 2
2(13(24(35(46(57(68(79(90(101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)9
8(109)99(110)100(111)101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109
)99(110)100(111)101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(1
10)100(111)101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)10
0(111)101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)100(111
)101)91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)100(111)101)
91(102)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)100(111)101)91(10
2)92(103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)100(111)101)91(102)92(
103)93(104)94(105)95(106)96(107)97(108)98(109)99(110)100(111)101
91
We could generalise the function by parameterising the constants that define the
breakpoint and increments:
mGen←{ ⍝ McCarthy's M91 function (generalised)
⍺←11 100 ¯10 ⍝ default increments and breakpoint
lo brk hi←⍺ ⍝ increment for hi and low numbers and breakpoint
{ ⍝
⍵>brk:⍵+hi ⍝ high number: M(n) → n-hi
∇ ∇ ⍵+lo ⍝ low number: M(n) → M(M(n+lo))
}⍵
}
Then:
5 10 ¯4∘mGen¨ 5 to 15
7 7 7 7 7 7 7 8 9 10 11
5 10 ¯3∘mGen¨ 5 to 15
8 9 8 9 8 9 8 9 10 11 12
Examples:
m91¨ 90 to 100 ⍝ ⍵<100 → 91
91 91 91 91 91 91 91 91 91 91 91
m91¨ 101 to 110 ⍝ ⍵≥100 → ⍵-10
91 92 93 94 95 96 97 98 99 100
See also: osc k6174
Back to: contents
Back to: Workspaces