递归就是子程序或函数重复的调用自己,并传入不同的变量来执行的一种程序设计技巧。
先看一个题:
设计一个可计算两数相乘,但仅用加法运算,不使用乘法运算的程序。
思路:假设欲计算出13×4,则13×4=13+(13×3)
=13+(13+(13×2))
=13+(13+(13+(13×1)))
=13+(13+(13+13))
=13+(13+26)
=13+39
=52 (即将13连加4次)
程序:
#include <stdio.h>
int mutiple(int m, int n)
{
int result;
if (n==1)
{
result = m;
}
else
{
result = m + mutiple(m,n-1);
}
return result;
}
void main()
{
int numA,numB,product;
printf("enter number A:");
scanf("%d",&numA);
printf("enter number B:");
scanf("%d",&numB);
product = mutiple(numA,numB);
printf("%d*%d=%d",numA,numB,product);
}
从上例可归纳出几个解递归问题的步骤:
(1)了解题意是否适合用递归来解题
(2)决定递归结束条件
(3)决定递归执行部分
说明:处理递归问题时,常采用if语句来判断是否适合递归结束条件,格式为:
if (符合递归结束条件)
返回 答案
else
使用递归将程序分割为更简单的小程序
--------------------------------------------------
递归的应用:
1、将字符串反转。
#include <stdio.h>
#include <string.h>
char string[30];
int length;
void Reverse(int n)
{
if (n<length)
{
Reverse(n+1);
printf("%c",string[n]);
}
}
void main()
{
printf("enter string:");
scanf("%s",&string);
length = strlen(string);
printf("the reverse string:");
Reverse(0);
printf("/n");
}
2、求两个数的最大公因子的程序。
#include <stdio.h>
int gcd(int m, int n)
{
if (n==0)
{
return m;
}
else
{
return gcd(n,m % n);
}
}
void main()
{
int numberA,numberB,result;
printf("the great common divisor of number A,number B/n");
printf("enter number A:");
scanf("%d",&numberA);
printf("enter number B:");
scanf("%d",&numberB);
result = gcd(numberA,numberB);
printf("gcd(%d, %d) = %d/n",numberA,numberB,result);
}
3、求费波纳伽级数。
#include <stdio.h>
int fib(int n)
{
if (n<=1)
{
return n;
}
else
{
return fib(n-1)+fib(n-2);
}
}
void main()
{
int number;
int result;
printf("the fibonacci numbers/n");
printf("please enter a number:");
scanf("%d",&number);
result = fib(number);
printf("fibonacci number of %d = %d/n",number,result);
}
----------黄国瑜,叶乃菁《数据结构c语言版》