内存空间申请 栈区 堆区 静态区 递归 栈溢出 斐波那契数列 阶乘

stack overflow 递归常见的错误栈溢出

递归

递归
程序调用自身的编程技巧成为递归,递归作为一种算法在程序设计语言中广泛应用,一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述解题过程多次重复计算,大大减少了程序的代码量递归的主要思考方式在与,把大事化小

递归的两个必要条件

1.存在限制条件,当满足这个限制条件时,递归便不再继续
2.每次递归调用之后,越来越接近这个限制条件

内存的空间存储 栈区 堆区 静态区

内存申请空间地方

打印一个整型值(无符号),按照顺序打印它的每一位,

例如:输入1234,输出 1 ,2 ,3 ,4

#include<stdio.h>
void print(int n)
{
    
    
	if (n > 9)
	{
    
    
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
    
    
	unsigned int num = 0;
	scanf("%d", &num);//1234
	print(num);

	return 0;
//递归方法
/*
print(1234)
print(123)4
print(12) 3 4
print(1) 2 3 4
*/
}

上面代码执行过程

求字符串的长度

方法1:编写函数允许创建临时变量,求字符串的长度

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)//str是一个指针变量存放的是数组第一个元素b的地址
{
    
    
	int count = 0;
	while (*str != '\0')
	{
    
    
		str++;
		count++;
	}
	return count;
}
int main()
{
    
    
	char arr[] = "bit";
	int len = my_strlen(arr);
	printf("len =%d\n", len);
	//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址	
	return 0;	
}

方法2:编写函数不允许创建临时变量,求字符串的长度

#include<stdio.h>
int my_strlen(char* str)
{
    
    
	if (*str != '\0')
	{
    
    
		return 1 + my_strlen(str + 1);
	}
	else
	{
    
    
		return 0;
	}
}
int main()
{
    
    
	char arr[] = "bitsdfasdfas";
	int len = my_strlen(arr);
	printf("len = %d\n", len);

	return 0;
//递归方法
//把大事情化小
//my_strlen("bit");
//1+my_strlen("it");
//1+1+my_strlen("t");
//1+1+1+my_strlen("\0");
//1+1+1+0
}

求阶乘的方法不用递归

int print(int n)
{
    
    
	int a = 0;
	int b = 1;
	for (a = 1; a <= n; a++)
	{
    
    
		b = b*a;
	}
	return b;
}
#include<stdio.h>
int main()
{
    
    
	int n = 0;
	int result = 0;
	scanf("%d", &n);
	result = print(n);
	printf("结果是:%d ", result);
	return 0;
}
			    当 n<=1	          结果是  1
fac(n)  
		        当 n>1            结果是  n*fac(n-1)

//描述第n个阶乘的时候

用递归的方式计算阶乘

#include<stdio.h>
int print(int n)
{
    
    
	if (n <= 1)
		return 1;
	else
		return n*print(n - 1);
}
int main()
{
    
    
	int n = 0;
	int result = 0;
	scanf("%d", &n);
	result = print(n);
	printf("result = %d\n", result);
	return 0;
}

用递归求斐波那契数列
不建议使用下面代码,仅供参考,因为它效率太低,执行重复次数太多

描述第n个斐波那契数的时候
求斐波那契数列的公式
n<=2 , 1
fib(n)
n>2 , fib(n-1)+fib(n-2)

下面代码仅供参考不建议使用

#include<stdio.h>
int Fib(int n)
{
    
    
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);	
}
int main()
{
    
    
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = Fib(n);
	printf("ret=%d\n", ret);	
	return 0;	
}

求斐波那契数效率高的方法

#include<stdio.h>
int Fib(int n)
{
    
    
	int a = 1;
	int b = 1;
	int c = 1;
	while(n > 2)
	{
    
    
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
    
    
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = Fib(n);
	printf("ret=%d\n", ret);
	return 0;
}


Guess you like

Origin blog.csdn.net/weixin_52495715/article/details/119708828