例1
代码:
#include<iostream>
using namespace std;
void fun(int i)
{
if (i > 0) fun(i / 2);
cout << i << endl;
}
int main()
{
fun(10);
return 0;
}
题解:
运行结果:
0
1
2
5
10
递归分析:
1> fun(10):
i = 5; fun(5);
cout << 10 << endl;
2> fun(5):
i = 2; fun(2);
cout << 5 << endl;
3> fun(2):
i = 1; fun(1);
cout << 2 << endl;
4> fun(1):
i = 0; fun(0);
cout << 1 << endl;
5>fun(0):
cout << 0 << endl;
例2
代码:
#include<iostream>
using namespace std;
void conversion(int n)
{
if (n == 0)
return;
else
{
int i = n % 2;
conversion(n / 2);
cout << i;
}
}
int main()
{
conversion(13);
return 0;
}
题解:
运行结果:
1101
递归分析:
1>conversion(13):
i = 1; conversion(6);
cout << 1;
2>conversion(6):
i = 0; conversion(3);
cout << 0;
3>conversion(3):
i = 1; conversion(1);
cout << 1;
4>conversion(1):
i = 1; conversion(0);
cout << 1;
5>conversion(0):
return ;
例3
代码:
#include<iostream>
using namespace std;
void conversion(int n)
{
if (n == 0)
return;
else
{
n = n / 2;
conversion(n);
cout << n % 2;
}
}
int main()
{
conversion(13);
return 0;
}
题解:
运行结果:
0110
递归分析:
1>conversion(13):
n = 6; conversion(6);
cout << 0;
2>conversion(6):
n = 3; conversion(3);
cout << 1;
3>conversion(3):
n = 1; conversion(1);
cout << 1;
4>conversion(1):
n = 0; conversion(0);
cout << 0;
5>conversion(0):
return ;
例4
代码:
#include<iostream>
using namespace std;
void Display(int n)
{
int i;
for (i = 1; i <= n; i++)
cout << ' ' << n;
cout << endl;
if (n > 0)
Display(n - 1);
}
int main()
{
Display(4);
return 0;
}
题解:
运行结果:
4 4 4 4
3 3 3
2 2
1
递归分析:
1>Display(4):
for(i = 1; i <= 4; i++)
cout << ' ' << 4;
Display(3);
2>Display(3):
for(i = 1; i <= 3; i++)
cout << ' ' << 3;
Display(2);
3>Display(2):
for(i = 1; i <= 2; i++)
cout << ' ' << 2;
Display(1);
4>Display(1):
for(i = 1; i <= 1; i++)
cout << ' ' << 1;
Display(0);
5>Display(0):
cout << endl;
例5
代码:
#include<iostream>
using namespace std;
float f(int A[], int i)
{
int m;
if (i == 0)
return A[0];
else
{
m = f(A, i - 1);
if (m > A[i])
return A[i];
else
return m;
}
}
int main()
{
int A[5] = { 5,3,1,4,2 };
cout << f(A, 4);
return 0;
}
题解:
运行结果:
1
递归分析:
1>f(A, 4):
m = f(A, 3);
return 1;
2>f(A, 3):
m = f(A, 2);
return 1;
3>f(A, 2):
m = f(A, 1);
return 1;
4>f(A, 1):
m = f(A, 0);
return m = 3;
5>f(A, 0):
return 5;
例6
代码:
//假设链表已经创建,链表中有三个结点,数据域为整数,分别为:1、2 、3
//调用下面函数时,参数指针p指向首元结点 1,参数n为链表长度,即 3
//根据上述已知,给出此函数的递归执行过程和运行结果
double GetAverage(LinkList p, int n)
{
if (!p->next)
return p->data;
else
{
double ave = GetAverage(p->next, n - 1);
return (ave * (n - 1) + p->data) / n;
}
}
题解:
运行结果:
2
递归分析:
1>GetAverage(P1, 3):
ave = GetAverage(P2, 2);
return 2;
2>GetAverage(P2, 2):
ave = GetAverage(P3, 1);
return 2.5;
3>GetAverage(P3, 1):
return 3;
例7
代码:
//假设链表已经创建,链表中有三个结点,数据域为整数,分别为:1、2 、3
//调用下面函数时,参数指针p指向首元结点 1
// n为全局变量,初值为3
//根据上述已知,给出此函数的递归执行过程和运行结果
double GetAverage(LinkList p)
{
if (!p->next)
return p->data;
else
{
n--;
double ave = GetAverage(p->next);
return (ave * n + p->data) / (n + 1);
}
}
题解:
运行结果:
1.75
递归分析:
1>GetAverage(P1):
n = 2;
ave = GetAverage(P2);
return 1.75;
2>GetAverage(P2):
n = 1;
ave = GetAverage(P3);
return 2.5;
3>GetAverage(P3):
return 3;
例8
代码:
#include<stdio.h>
int fact()
{
static int i = 5;
if (i == 0)
return 1;
else
{
i--;
return(fact() * (i + 1));
}
}
int main()
{
printf("factor of 5!=%d\n", fact());
return 0;
}
题解:
运行结果:
factor of 5!=1
递归分析:
1>fact():
i = 5; i = 4;
return 1;
2>fact():
i = 3;
return 1;
3>fact():
i = 2;
return 1;
4>fact():
i = 1;
return 1;
5>fact():
i = 0;
return 1;
6>fact():
return 1;
例9
代码:
#include<stdio.h>
int fact()
{
static int i = 5;
if (i == 0)
return 1;
else
{
i--;
return((i + 1) * fact());
}
}
int main()
{
printf("factor of 5!=%d\n", fact());
return 0;
}
题解:
运行结果:
factor of 5!=120
递归分析:
1>fact():
i = 5; i = 4;
return 120;
2>fact():
i = 3;
return 24;
3>fact():
i = 2;
return 6;
4>fact():
i = 1;
return 2;
5>fact():
i = 0;
return 1;
6>fact():
return 1;