Algorithm_01--C#递归算法

Posted 加油啊,敲代码的小伙纸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Algorithm_01--C#递归算法相关的知识,希望对你有一定的参考价值。

递归算法本质: 1、方法的自我调用 2、有明确的终止条件 3、每次调用时,问题规模在不断减少。通过递减,最终到达终止条件

///递归算法本质:
///1、方法的自我调用
///2、有明确的终止条件
///3、每次调用时,问题规模在不断减少。通过递减,最终到达终止条件

 

 

问题:程序在输入1000后(即1到1000的和),程序会出现异常。

解答:百度后得出结论,栈溢出异常。

1、递归方法在每次调用自身时,都会生成一个新的栈帧并压入调用栈。

2、对于计算1到100的和,递归深度是100层,这还在大多数的编程语言栈的大小范围内。

3、对于1到1000的和,递归深度为1000层,这通常会超过编程语言栈的大小限制,从而导致栈溢出。

4、C#中默认栈大小是1MB,可以通过修改配置文件app.config来增大,但是也会带来内存占用过高的问题。

5、所以递归深度过大时,应该避免使用递归方法,而使用迭代算法,对于这个问题可以使用for循环迭代计算。

 

延申:

大多数编程语言的默认栈大小都在1MB以上,可以支持1000层以内的递归调用。像C#的默认栈是1MB,Java是512KB,Python是10MB等。当递归深度在1000层以内时,占用的栈空间还在可控范围内,不会导致内存占用过高的问题。3. 对于简单的算法逻辑,递归深度1000层以内的递归代码还比较清晰简洁,易于理解。如果使用迭代重写,代码的可读性会差一些。

总结:大概递归深度过大的,就不要考虑使用递归来计算了。

网易云课堂_C语言程序设计进阶_第五周:递归与简单算法:递归搜索二分搜索简单排序

 

5.1可变数组

5.2链表

 

5.1可变数组

 

Resizable Array

Think about a set of functions that provide a mechanism of resizable array of int.

Growable

Get the current size

Access to the elements

 

The Interface

Array array_create(int init_size);

void array_free(Array *a);

int array_size(const Array *a);

int *array_at(Array *a, int index);

void array_inflate(Array *a, int more_size);

 

 

 

5.2链表

以上是关于Algorithm_01--C#递归算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构&算法_算法基础之前传(递归时间复杂度空间复杂度二分查找)

[Algorithm]Java 版递归算法解迷宫问题哈诺塔问题八皇后问题

python每日算法 | 算法的起步与递归算法(汉诺塔问题)

Heap's Algorithm - Python 中用于生成排列的非递归方法

零基础学启发式算法-贪心算法(Greedy Algorithm)

图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能