函数递归与迭代

什么是递归?

  • 程序调用自身的编程技巧称为递归

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

练习1:(画图理解)

接收一个无符号整型值,按照顺序打印它的每一位。例如:输入:1234 ,输出:1 2 3 4

分析:

函数递归与迭代_第1张图片

 

void print(unsigned int n)
{
    if (n > 9)
    {
        print(n / 10);
    }
    printf("%d ", n % 10);
}

int main()
{
    unsigned int num = 0;
    scanf("%u", &num);
    print(num);
    return 0;
}

递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续

  • 每次递归调用之后越来越接近这个限制条件

满足以上两个条件也不一定正确:

例如:

void test(int n)
{
	if (n < 10000)
	{
		test(n + 1);
	}
}
int main()
{
	test(1);
	return 0;
}

函数递归与迭代_第2张图片

 

栈区(用于存放一些暂时的变量):局部变量,函数形参

堆区:动内存态分配的

静态区:全局变量,静态变量

 函数递归与迭代_第3张图片函数递归与迭代_第4张图片

 

练习2 :编写函数不允许创建临时变量,并求字符串长度

函数递归与迭代_第5张图片

 

int my_strlen(char* p)
{
	if (*p != 0)
	{
		return 1 + my_strlen(p + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = "bit";
	printf("%d\n", my_strlen(arr));
	return 0;
}

递归与迭代

有一些功能,可以使用迭代的方式实现,也可以使用递归

练习3:求n的阶乘(不考虑溢出)

(1)使用迭代

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	//迭代(循环)
	for (int i = 1; i <= n; i++)
	{
		ret = ret * i;
	}
	return 0;
}

(2)使用递归

函数递归与迭代_第6张图片

 

//使用递归
int fac(int n)
{
	if (n >= 1)
	{
		return n * fac(n - 1);
	}
	else
		return 1;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d\n", ret);
	return 0;
}

练习4:求第n个斐波那契数

(1)使用递归

函数递归与迭代_第7张图片

 

//使用递归
//使用递归效率太低
//int count = 0;
int fib(int n)
{
	//统计第三个斐波那契数的计算次数
	//if (n == 3)
	//{
	//	count++;
	//}
	if (n<= 2)
	{
		return 1;
	}
	else
		return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

(2)使用迭代

 函数递归与迭代_第8张图片

 

//使用迭代
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;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

你可能感兴趣的:(C语言,函数,动态规划,算法)