#define _CRT_SECURE_NO_WARNINGS 1
//1、函数的嵌套调用和链式访问 --函数和函数之间可以有机地组合的
//1.1 函数的嵌套调用
#include <stdio.h>
#include "add.h"
//
//void new_line()
//{
// printf("hehe\n");
//}
//
//void three_line()
//{
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// new_line();
// }
//}
//int main()
//{
// three_line();
// return 0;
//}
//1.2链式访问 --- 把一个函数的返回值作为另外一个函数的参数
//int main()
//{
// int len = 0;
// //len = strlen("abc");
// printf("%d", strlen("abc"));
// return 0;
//}
//int main()
//{
// printf("%d", printf("%d", printf("%d", 43))); // :4321 printf函数的返回值是字符的数量
// return 0;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// int sum=Add(a, b);
// printf("%d\n", sum);
// return 0;
//}
//2、函数的声明和定义
//3、函数的递归 --程序调用自身的编程技巧成为递归
//递归的两个必要条件
//--存在限制条件,当满足这个限制条件的时候,递归便不再继续
//--每次递归调用之后越来越接近这个限制条件
//int main()
//{
// printf("hehe\n");
// main();
// return 0;
//}
//练习:接收一个整型值,按照顺序打印它的每一位数字。如:输入:1234 输出:1 2 3 4
//void print(int a)
//{
// if (a > 9)
// {
// print(a / 10);
// }
// printf("%d ", a % 10);
//}
//
//int main()
//{
// unsigned int num = 0;
// scanf("%d", &num);
// print(num);
// return 0;
//}
//练习:不使用变量,求字符串长度
//用变量例:
//void len(char* a)
//{
// int count = 0;
// while (*a != '\0')
// {
// a++;
// count++;
// }
// printf("字符串长度为:%d\n", count);
//}
//
//int len(char* a)
//{
// if (*a != '\0')
// {
// return 1 + len(a + 1);
// }
// else
// {
// return 0;
// }
//}
//
//int main()
//{
// char arr[] = "abc";
// /*printf("%d", strlen(arr));*/
// int lens = len(arr);
// printf("字符串长度为:%d", lens);
//}
//函数迭代
//练习3:求n的阶乘
//int factorial(int a)
//{
// if (a > 1)
// {
// return a*factorial(a - 1);
// }
// else
// {
// return 1;
// }
//}
//
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int sum = factorial(n); //用变量赋值,直接用n输出值不变
// /*int i = 0;
// int num = 1;
// for(i = 1; i <= n; i++)
// {
// num = num * i;
//
// }*/
// printf("%d", sum);
//}
//练习4:求第N个斐波那契数
//函数1:迭代算法
//int count = 0;
//int fibonacci(int x)
//{
// if (x == 3)
// {
// count++;
// }
// if (x > 2)
// {
// return fibonacci(x-1) + fibonacci(x - 2);
// }
// else
// return 1;
//}
//函数2:循环
//int fibonacci(int x)
//{
// int a = 1;
// int b = 1;
// int c = 0;
// int tmp = 0;
// while (x >2)
// {
// tmp = a;
// c = a + b;
// a = b;
// b = c;
// x--;
// }
// return c;
// if (x <= 2)
// {
// return 1;
// }
//}
//
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int sum =fibonacci(n);
// printf("%d\n", sum);
// //printf("count = %d\n", count);
//}
//
//递归和迭代有什么区别?
//一、含义不同:
//递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
//递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。
//二、结构不同:
//递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。 递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。