函数递归
递归:程序调用自身的编程技巧成为递归(recursion)。
主要思想:大事化小。把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来进行求解。
递归的两个必要条件:
存在限制条件,当满足这个限制条件时递归便不再继续;
每次递归调用之后会越来越接近这个限制条件。
循环与迭代:迭代简单讲就是把一件事反复去做。
递归相关题目与代码:
#include<stdio.h>
//1. 递归和非递归分别实现求第n个斐波那契数
//例如:
//输入:5 输出:5
//输入:10, 输出:55
//输入:2, 输出:1
//
①非递归
//int main()
//{
// int a = 0, b = 1, c = 1;
// int i = 1;
// int n = 0;
// printf("求第n个斐波那契数,请输入n \n");
// scanf("%d", &n);
// while (i < n)
// {
// c = a + b;
// a = b;
// b = c;
// i++;
// }
// printf("%d\n", c);
// return 0;
//}
②递归
//int fib(int n)
//{
// if (n <= 2)
// return 1;
// else
// return fib(n - 1) + fib(n - 2);
//}
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// ret = fib(n);
// printf("%d\n", ret);
// return 0;
//}
//2. 编写一个函数实现n的k次方,使用递归实现。
//要求:k可以正数或负数
//double Power(int n, int k)
//{
// if (k > 0)
// return n*Power(n, k - 1);
// else if (k == 0)
// return 1;
// else
// return 1.0 / Power(n, -k);
//}
//int main()
//{
// int n = 0, k = 0;
// double ret = 0.0;
// printf("求n的k次方,请输入n和k:\n");
// scanf("%d%d", &n, &k);
// ret = Power(n, k);
// printf("%lf\n", ret);
// return 0;
//}
//3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
//例如:调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
输入:1729,输出:19
//int DigitSum(int a)
//{
// if (a < 10)
// return a;
// else
// return DigitSum(a / 10) + a % 10;
//}
//int main()
//{
// int a = 0;
// printf("请输入一个非负整数: \n");
// scanf("%d", &a);
// int ret = DigitSum(a);
// printf("%d\n", ret);
// return 0;
//}
//4. 编写一个函数 reverse_string(char * string)(递归实现)
//实现:将参数字符串中的字符反向排列。
//要求:不能使用C函数库中的字符串操作函数。
//
//void reverse_string(char * string)
//{
// if (*string == '\0')
// {
// return;
// }
// reverse_string(string + 1);
// printf("%c ", *string);
//}
//int main()
//{
// char* arr = "abcd";
// reverse_string(arr);
// return 0;
//}
//5. 递归和非递归分别实现strlen
①非递归
//int my_strlen(char*str)
//{
// int count = 0;
// while (*str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}
//int main()
//{
// char arr[] = "asus";
// int len = my_strlen(arr);
// printf("%d\n", len);
// return 0;
//}
②递归
//int my_strlen(char*str)
//{
// if (*str != '\0')
// {
// return 1 + my_strlen(str + 1);
// }
// else
// return 0;
//}
//int main()
//{
// char arr[] = "asus";
// int len = my_strlen(arr);
// printf("%d\n", len);
// return 0;
//}
//6. 递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
①非递归
//int main()
//{
// int n = 0;
// int i = 1;
// int product = 1;
// printf("求n的阶乘,请输入n:\n");
// scanf("%d", &n);
// while (i <= n)
// {
// product = product * i;
// i++;
// }
// printf("%d\n", product);
// return 0;
//}
②递归
//int factorial(int n)
//{
// if (n <2)
// return 1;
// else
// return n*factorial(n - 1);
//}
//int main()
//{
// int n = 0;
// printf("求n的阶乘,请输入n:\n");
// scanf("%d", &n);
// int product = 0;
// product = factorial(n);
// printf("%d\n", product);
// return 0;
//}
//7. 递归方式实现打印一个整数的每一位
//void print(int a)
//{
// if (a>9)
// {
// print(a / 10);
// }
// printf("%d ",a%10 );
//}
//int main()
//{
// int a = 0;
// printf("请输入要打印的数字:\n");
// scanf("%d", &a);
// print(a);
// return 0;
//}