简单理解什么是递归(阶乘演示)


在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
一个数的阶乘来演示递归
4!= 4 * 3 * 2 * 1

一般情况下我们可能会这样写:

result = 1
num = 1
while num < 5:
    result *= num
    num += 1
print(f"4的阶乘结果为:{result}")

pycharm中执行结果:
	4的阶乘结果为:24

使用递归:

def get_num(number):
    if number > 1:
        return number * get_num(number - 1)
    else:
        return number


result = get_num(4)
print("4的阶乘结果为:%s" % result)

pycharm中执行结果:
	4的阶乘结果为:24

画图理解:

文字理解:

===> get_num(4)
===> 4 * get_num(3)
===> 4 * (3 * get_num(2))
===> 4 * (3 * (2* get_num(1)))
===> 4 * (3 * (2 * (1 * 1)))
===> 4 * (3* (2 * 1))
===> 4 * (3 * 2)
===> 4 * 6
===> 24

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

注意: 使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

示例代码:

def demo():
    print("test...")
    demo()

    
demo()

上面的代码类似于写了个while True 没有写结束循环的条件。

实例:

/* * 递归实现n个子母随机组合每次输出n个子母(每次输出不同组合直至输出所有组合结果) * */
public class TestRecursive {
	public static void main(String[] args) {
		char[] chs = { 'a', 'b', 'c' };
		int number = 2; // 每次输出几个字符
		arrange(chs, 0, chs.length, number);

	}

	public static void arrange(char[] chs, int start, int len, int number) {
		if (start == len - 1) {
			for (int i = 0; i < number; i++) {
				System.out.print(chs[i]);
			}
			System.out.println();
			return;
		}
		for (int i = start; i < len; i++) {
			char temp = chs[start];
			chs[start] = chs[i];
			chs[i] = temp;
			arrange(chs, start + 1, len, number);
			temp = chs[start];
			chs[start] = chs[i];
			chs[i] = temp;

		}
	}
}

eclipse中执行结果:
	ab
	ac
	ba
	bc
	cb
	ca


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM