首页 > 其他 > 详细

专题:递归

时间:2020-11-01 22:02:40      阅读:27      评论:0      收藏:0      [点我收藏+]

不同函数之间互相调用

#include <stdio.h>

void f();
void g();
void k();

int main()
{
	f();

	return 0;
}

void f()
{
	g();
	printf("11\n");
}

void g()
{
	printf("22\n");
	k();
}

void k()
{
	printf("哈哈\n");
}

自己调用自己

#include <stdio.h>

void f(int );

int main()
{
	f(3);

	return 0;
}

void f(int n)
{
	if(1 == n)	//变量放右边,常量值放左边[好习惯]
	{
		printf("哈哈\n");
	}
	else
	{
		f(n-1);
	}
}

A函数调用B函数

A函数调用B函数举例1

#include <stdio.h>

//直接调用

int f(int n);

int main()
{

	int val;

	val = f(5);
/*
当在main函数的运行期间调用f函数时,在运行被调函数之前,系统需要完成三件事
	1. 将所有的实际参数,主调函数下一条语句的返回地址等信息传递给被调函数f保存
	2. 为被调函数f的局部变量(也包括形参)分配存储空间
	3. 将控制转移到被调函数f的入口
*/
	printf("val = %d\n", val);

	return 0;
}


int f(int n)
{
	n += 2;

	return n;
/*
从被调函数返回主函数之前,系统也要完成三件事
	1. 保存被调函数f的返回结果
	2. 释放被调函数f所占的存储空间
	3. 依照被调函数f保存的返回地址将控制转移到主调用函数main
*/
}

A函数调用B函数举例2

#include <stdio.h>

//间接调用

int f(int m);
int g(int n);

int main()
{
	int val;

	val = f(5);
	printf("val = %d\n", val);

	return 0;
}

int f(int m)
{
	m = g(m);

	return m;
}

int g(int n)
{
	n *= 2;

	return n;
}

A函数调用A函数举例

#include <stdio.h>

int f(int n);

int main()
{
	int val;
	 
	val = f(5);

	return 0;
}

int f(int n)
{
	if(3 > n)
	{
		printf("哈哈\n");
	}
	else
	{
		n = f(n-1);
	}

	return n;
}

递归应用

1. 求阶乘

#include <stdio.h>

void f(long n);
long g(long m);

//for循环实现
/*
int main()
{
	int val;

	printf("请输入一个数字:");
	printf("val = ");
	scanf("%d", &val);

	f(val);

	return 0;
}

void f(long n)
{
	int i; 
	long mult = 1;   //mult: multiple

	for(i = 1; i<=n; i++)
	{
		mult = mult * i;
	}
	printf("%ld的阶乘是:%ld\n", n, mult);
	return;
}
*/
/*——————————————————————————————————————*/

//递归实现
int main()
{
	long mult;	 //mult: multiple

	mult = g(3); //假定m是大于或等于0的值

	printf("3的阶乘是:%ld\n", mult);

	return 0;
}

long g(long m)
{
	if(1 == m || 0 == m)
	{
		return 1;
	}
	else
	{
		return g(m-1) * m;
	}
}

2. 1+2+3+4+...100的和

#include <stdio.h>

long sum(int n);

int main()
{
	
	printf("100以内的整数和是:%d\n", sum(100));

	return 0;
}

long sum(int n)
{
	if(1 == n)
	{
		return 1;
	}
	else 
	{
		return sum(n-1)+n;
	}
}

3. 汉诺塔

#include <stdio.h>

void hanoi(int, char, char , char);

int main()
{
	int n;
	char A = ‘A‘;
	char B = ‘B‘;
	char C = ‘C‘;

	printf("请输入需要移动盘子的个数:\n");
	scanf("%d", &n);

	hanoi(n, A, B, C);

	return 0;
}

void hanoi(int n, char a, char b, char c)
{
	if(1 == n) //此时是原柱子【没有移动前】最上方的一个盘子,编号为1
	{
		printf("把编号为%d的盘子	直接从%c移动到%c上\n", n, a, c);
	}
	else
	{
		//		  源头 借助 目标   
		hanoi(n-1, a,   c,   b);	
		printf("把编号为%d的盘子	从%c移动到%c上\n", n, a, c);
		hanoi(n-1, b, a, c);
	}
}

//该函数所处理的数据规模必须在递减[要解决n个问题,必须先解决n-1个问题]

//假定此题需要移动5个盘子,就需要先把上面4个盘子移到另一个柱子,要移动4个盘子,就需要先把上面3个盘子移到另一个柱子......

4. 斐波拉契数列

#include <stdio.h>
 
int f(int i);
 
int f(int i)
{
    if (i == 0 || i == 1)
	{
        return i;
    }
    else 
	{
        return f(i - 1) + f(i - 2);
    }
}
 
int main()
{
    int i, n;
 
    n = 20;
    for (i = 0; i < n; i++)
	{
        printf("F(%d) = %d\n", i, f(i)); 
    }
 
    return 0;
}

专题:递归

原文:https://www.cnblogs.com/gmengshuai/p/13909681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!