C语言中的函数递归

2024-01-22 21:32:03 浏览数 (1)

C语言中的函数递归

函数递归
  • C语言中的函数递归
  • 什么是递归
  • 递归必须注意的事
  • 递归练习题
      • 1接受一个整型(无符号),按顺序打印每一位
      • 2用递归求n的k次方
      • 3编写函数不用许创建临时变量,求字符长度
      • 青蛙跳台阶
  • 递归缺点

什么是递归

程序调用自生的编程技巧称作递归。所谓递归就必然存在着递出与回归,递归的全过程其实是将一个问题分成若干个解法相同的问题,将初始的数据一直往后传送,当到达一个临届值后开始回归,从原路返回实现问题的解决。 递归策略使得只需要少量的程序就可以描述出解题中多次重复的计算,大大减少了代码的长度。 递归的精髓就在于大事化小。

递归必须注意的事

1存在限制条件,当满足这个条件时,递归便不在继续,(也就是说要有一个临界值) 2每次递归后都会接近临界值,且递归层次不要太深。

递归练习题

1接受一个整型(无符号),按顺序打印每一位

eg:输入1234,打印1 2 3 4; 首先读题其实就是将不同位拆开,且先将1打出来。那么当这个数只剩最高位也就是临界值, 所以a(输入的数)/10==0;也就是临界值的判断。然后每回打印a就行了

代码语言:javascript复制
#include <stdio.h>
int print(unsigned int n)
{
	if (n > 9)
	{
		
		print(n/10);
	}
	n = n % 10;
	printf("%d ", n);
	return 0;
}
int main()
{
	unsigned int a = 0;
	scanf("%u", &a);
	print(a);
	return 0;
}
2用递归求n的k次方
代码语言:javascript复制
#include <stdio.h>
int index(int n, int k)
{
	int i = 1;
	if (i < k)
	{
	
		return n * index(n, k - 1);
	}
	else
	{
		return n;
	}
}
int main()
{
	int n = 2;
	int k = 5;
	int num= index(n, k);
	printf("%d", num);
	return 0;
}

这个比较简单就不做图解了;

3编写函数不用许创建临时变量,求字符长度

引入一个知识点,当你函数调用传送的是一个数组时,数组名其实传递的是数组首元素的地址。还有就是当使用char arr[] = “bit”;这种方式创建数组时其实字符串是“bit”

代码语言:javascript复制
#include <string.h>
#include <stdio.h>
int my_strlen1(char* str)
{
	int count = 0;
	while (*str != '')
	{
		count  ;
		str  ;//字符指针 1,向后跳1个字符
	}
	return count;
}

int my_strlen2(char* str)
{
	if (*str != '')
		return 1   my_strlen2(str   1);
	else
		return 0;
}

int main()
{
	char arr[] = "bit";

	int len1 = my_strlen1(arr);
	//数组名其实传递的是数组首元素的地址
	printf("%dn", len1);
	int len2 = my_strlen2(arr);
	printf("%dn", len2);
	return 0;
}

比如我们输入一个字符串bit,

青蛙跳台阶

小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?很经典的一道题 题解://小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法? //从题可知小乐乐在n台阶时他到这一台阶要不1从n-1上来,要不2从n-2阶上来 //假设到n节有f(n)方式,n-1节有f(n-1)方式,n-2节有f(n-2)方式 //易得f(n)=f(n-1) f(n-2)

代码语言:javascript复制
#include <stdio.h>
int way(num)
{
    if (num == 1)
        return 1;
    if (num == 2)
        return 2;
    else {
        return way(num - 1)   way(num - 2);
    }
}
int main()
{
    int num;
    scanf("%d", &num);
    printf("%d", way(num));
    return 0;
}

递归缺点

1递归会导致函数的多次调用,而每次函数调用过程中都会在程序的调用栈(call stack)所开辟空间,但是栈区的空间是有限的当递归的层次太深时就会出现栈溢出(strack overflow). 2递归可能会导致函数的计算可能会变多如斐波那契数列的计算,也就是不够快 。

0 人点赞