Skip to main content

recursion - Kernel crashed after $RecursionLimit = Infinity


$RecursionLimit = Infinity; 
T[n_, k_]:= T[n, k] = If[n == 0 || k == 1, 1, T[n, k-1] + If[nTable[T[n!, n], {n, 1, 9}]

Without $RecursionLimit = Infinity, I get an error message: "Recursion depth of 1024 exceeded".


I accept that this program needs a lot of the memory, but a correct solution would be some error message (for example "memory overflow"), not a crash of the kernel.


Why did the kernel crash?



Answer




The kernel crashed because it ran through all the stack space available to it. The Memory Management Tutorial page in the documentation states the following regarding stack space:



In the Wolfram System, one of the primary uses of stack space is in handling the calling of one Wolfram Language function by another. All such calls are explicitly recorded in the Wolfram System Stack discussed in "The Evaluation Stack". You can control the size of this stack by setting the global parameter $RecursionLimit. You should be sure that this parameter is set small enough that you do not run out of stack space on your particular computer system.



On the same page, one also finds:



If the specified stack space limit is exceeded, the program usually just exits.



So if you set $RecursionLimit too low, you get the error you refer to; if you set it too high, on the other hand, you run out of available stack space and the kernel gives up the ghost...


I'm afraid that I can't propose any general solution to your problem, unfortunately. The problem has been discussed in many venues before:




To sum up what has been said in those comments, the problem of predicting in advance how much stack your computation will need, and therefore setting a reasonable $RecursionLimit that will prevent crashes is VERY hard, and possibly insoluble in the general case, especially using the high level code that Mathematica affords us, since this typically requires one to know how the intermediate results are stored, how big they are, where they are stored, etc.


An additional problem is the fact that it may be difficult to pinpoint exactly how much space is being used by a specific computation. In particular, functions like MaxMemoryUsed "will not typically account for code space, stack space, or the effects of heap fragmentation" (see docs page).


Finally, it would be nice if the situation were handled more gracefully. For instance, the computation might $Fail or be $Aborted before crashing the kernel and losing the information / values currently stored in it, which may have taken a long while to compute.


A caveat: this is my interpretation "from the outside, looking in"; I'd love to hear from more experienced users or from those that have intimate knowledge of the inner workings of MMA.


Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....