1、定义是递归的
有很多数学函数是递归定义的,比如阶乘函数和斐波那契数列
#include<stdio.h>
#include<cstdlib>
#include<iostream>
using namespace std;
//计算阶乘的函数
int Fact(long n){
if (n == 0)
return 1;
else
return n*Fact(n-1);
}
//计算第n个菲波那切数的值
int Fib(long n){
if (n == 1 || n == 2) //第一个和第二个值均是1 ,还有的是第一个为0,第二个为1,所以条件不同,结果不同
return 1;
else
return Fib(n-1) + Fib(n-2);
}
int
main(){
int n;
while(1){
cout<<"\n请输入n:";
cin>>n;
cout<<"\n阶乘计算结果如下:"<<Fact(n)<<endl;
cout<<"\n第"<<n<<"个菲波那切数如下:"<<Fib(n)<<endl;
}
}

打印前n个斐波那契数列
#include<stdio.h>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
long long int first=1,second=1,third=0;
int i=1,n;
cout<<"\n输入要打印的项数:";
cin>>n;
cout<<"\n打印如下:";
cout<<first<<" "<<second<<" ";
for(i;i<=n-2;i++)
{
third = first + second;
cout<<third<<" ";
first = second;
second = third;
}
}

递归分析
像这样把一个很复杂的问题化解为若干个相对简单且解法相同或者类似的子问题来求解,便称作递归求解!这种分解-求解的策略叫做“分治法”。
采取分治法进行递归调用需要满足以下三个条件。
(1)、能将一个问题转变成一个新问题,而新问题与原问题的解法相同或者类似,不同的仅是处理对象,而且这些处理对象更小且更有变化规律!
(2)、可以通过上述转化而使问题简化!
(3)、必须有一个明确的出口,或者称递归的边界!
“分治法”求解递归问题算法的一般形式为:
void p(形参)
{
if (递归结束条件成立)可直接求解; //递归终止的条件
else //递归步骤
p(较小形参)
}
2、数据结构是递归的
对于链表,其结点LNode的定义是由数据域data和指针域next组成,而指针域next是一种指向LNode类型的指针,即LNode的定义中又用到了其自身,所以链表是一种递归的数据结构!
遍历输出各个节点的递归算法
**//使用递归实现单链表的输出操作
void ListPrint_L_Rec(LinkList L){
if(L==NULL){
return; //递归终止
}
else{
cout<<L->data<<" ";
ListPrint_L_Rec(L->next); //L指向后继节点继续递归
}
}
**
在递归算法中,如果当递归结束条件成立时,只执行 return 而没有任何返回值的时候,“分治法”一般可以简化为:
void p(形参)
{
if (递归结束条件不成立)
p(较小形参)
}
所以上面的算法可以简化如下
//使用递归实现单链表的输出操作
void ListPrint_L_Rec(LinkList L){
if(L!=NULL){
cout<<L->data<<" ";
ListPrint_L_Rec(L->next); //递归函数
}
}

3、问题的解法是递归的
Hanoi塔问题、八皇后问题、迷宫问题


本文探讨了递归概念在数学函数(阶乘和斐波那契数列)中的应用,展示了链表作为递归数据结构的实例,并深入剖析了递归算法和分治策略。此外,文中还涉及Hanoi塔、八皇后等问题的递归解决方案,以及二叉树遍历的递归与非递归方法。
536

被折叠的 条评论
为什么被折叠?



