函数递归调用技巧

🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
       🍟欢迎来到我的博文,本文主要讲解如何使用函数的递归调用技巧,基于这篇文章,期待你能对递归调用有一定的理解。🍟
🥞喜欢的朋友可以关注一下,下次更新不迷路🥞
🍬目录
          🥙一、递归的概念
         🌮二、递归的组成部分
         🍰三、递归调用实例
🥙一、递归的概念
      程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
🌮二、递归的组成部分
        一般来说,递归需要有:1.边界条件 2.递归前进段 3.递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

🍰三、简单的递归程序
🍟例一:

        有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。向第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。
解题思路:要求第5个学生的年龄,就必须先知道第4个学生的年龄,而第4个学生的年龄也不知道,要求第4个学生的年龄必须先知道第3个学生的年龄,而第3个学生的年龄 ;又取决于第2个学生的年龄,第2个学生的年龄取决于第1个学生的年龄。而且每一个学 生的年龄都比其前1个学生的年龄大2。即: 
age(5)=age(4)+2
age(4)=age(3)+2 
age(3)=age(2)+2 
age(2)=age(1)+2
age(1)=10


#include<stdio.h>
int age(int n)
{
	if (n == 1)
		return 10;
	else
		return 2 + age(n - 1);
}
int main(void)
{
	int n = 5;
	int age5 = age(n);
	printf("第5个同学的年龄为%d", age5);
	return 0;
}


🍟例二:

        求n的阶乘的两种方法


#include<stdio.h>
int main(void)
{
	int i = 0;
	int n = 0;
	int ret = 1;
	printf("请输入n大小" );
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d", ret);
	return 0;
}

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

🍟例三:

        函求字符串的长度。

        1.使用库函数

#include<stdio.h>
#include<string.h>
int main(void)
{
	char array[] = "abcdefg";
	int len = strlen(array);
	printf("%d", len);
	return 0;
}

        2.使用循环的方法

#include<stdio.h>
int  my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
int main(void)
{
	char array[] = "abcdefg";
	int len = my_strlen(array);
	printf("%d", len);
	return 0;
}

        3.递归

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

🍟例四:

        Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座X,Y,Z开始时x座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个子从X座移到Y座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上,在移动的过程可以利用Y座。

问题一(“将X上的63个盘子借助Z移到Y上”)拆解为:-将前62个盘子从X移动到Z上。
----将最底下的第63个盘子移动到Y上。
----将Z上的62个盘子移动到Y上。
问题二(“将Y上的63个盘子借助X移到Z上”)拆解为:
---将前62个盘子从Y移动到X上。
---将最底下的第63个盘子移动到Z上。
---将X上的62个盘子移动到Y上。
................................

将X上的3个盘子借助Z移到Y上

----将最底下的第1个盘子移动到Y上。
----将Z上的2个盘子移动到Y上。

#include<stdio.h>

void hanio(int n, char x, char y, char z)
{
	if (n == 1)
	{
		printf("%c-->%c\n", x, z);
	}
	else
	{
		hanio(n - 1, x, z, y);
		printf("%c-->%c\n", x, z);
		hanio(n - 1, y, x, z);
	}
}
int main()
{
	int n = 0;
	printf("请输入汉诺塔层\n");
	scanf_s("%d", &n);
	hanio(n , 'x', 'y', 'z');
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值