函数递归(即递推回归)调用自身函数
数学归纳法是函数递归的基础
⼀个
⼤型复杂问题
层层转化为⼀个与原问题相似,但规模较⼩的
⼦问题
来求解;直到⼦问题不能再
被拆分,递归就结束了。所以递归的思考⽅式:
⼤事化⼩
递归在书写的时候,有2个必要条件:
•
递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
•
每次递归调⽤之后越来越接近这个限制条件
以顺序打印一个整数的每一位为例:
运用数学归纳法,先以n=1234为例,打印这个整数,可以每次对其拆分两部:调用自身函数+打印数字
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void print(int n);
int main()
{
int m = 0;
printf("input an integer:");
scanf("%d", &m);
print(m);
return 0;
}
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d", n % 10);
}
字符串逆序:
数学归纳法,以abcdef为例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define N 40
void reverse_string(char* string);
int main()
{
char str[N];
gets(str);
reverse_string(str);
puts(str);
return 0;
}
void reverse_string(char* string)
{
int len = strlen(string);
char temp = *string;
*string = *(string + len - 1);
*(string + len - 1) = '\0';
if (strlen(string + 1) > 1)
{
reverse_string(string + 1);
}
*(string + len - 1) = temp;
}
可具体列出递推函数表达式
汉诺塔问题
设计函数:
将n-1个圆盘从A移到C(借助B) Hanoi(n-1,a,c,b)
将n号圆盘从A移到B Move(n,a,b)
将n-1个圆盘从C移动B(借助A) Hanoi(n-1,c,b,a)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Hanoi(int n, char a, char b, char c);//用递归方法将n个圆盘借助c从a移到b
void Move(int n, char a, char b);//将第n个圆盘从a移到b
int main()
{
int n;
printf("input the number of disks:");
scanf("%d", &n);
printf("steps of moving %d disks from A to B by means of c :\n", n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
void Hanoi(int n, char a, char b, char c)
{
if (n == 1)
{
Move(n, a, b);
}
else
{
Hanoi(n - 1, a, c, b);
Move(n, a, b);
Hanoi(n - 1, c, b, a);
}
}
void Move(int n, char a, char b)
{
printf("move %d:from %c to %c\n", n, a, b);
}
斐波那契数:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Fib(int n);
int main()
{
int n = 0;
do
{
printf("input an integer:");
scanf("%d", &n);
} while (n <= 0);
int ret = Fib(n);
printf("Fib(%d)=%d\n", n, ret);
return 0;
}
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}