递归和迭代
递归:指在函数的定义中使用函数自身的方法。
特点:把一个大型的复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需较少的代码就描述出解题过程需要多次重复的内容,大大减少了程序的代码量,但是通常使用递归效率不是很高。
递归函数分为调用和回退阶段,递归的回退顺序是他调用顺序的逆序。
迭代:重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(while,do…while ,for等等)。
递归实现斐波那契数列:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0 ;
scanf("%d",&n);
for(int i = 1;i<n ;i++){
printf("%d\n",Fib(i));
}
return 0;
}
int Fib(int i){
if(i==1){
return 0;
}
else if(i==2){
return 1;
}
else{
return Fib(i-1)+Fib(i-2);
}
}
迭代实现斐波那契数列:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i ;
int a[40];
a[0] = 0;
a[1] = 1;
printf("%d %d ",a[0],a[1]);
for( i =2 ;i<40;i++){
a[i] = a[i-1] +a[i-2];
printf("%d ",a[i]);
}
return 0;
}
对比两种实现斐波那契的代码,迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。
递归实现汉诺塔:
#include <stdio.h>
#include <stdlib.h>
//汉诺塔
int main(){
int n;
printf("请输入汉诺塔的层数: ");
scanf("%d",&n);
printf("移动的步骤如下:\n");
move(n,'x','y','z');
return 0;
}
//将n个盘子x借助y移动到z
void move(int n,char x, char y, char z){
if(1==n){
printf("%c-->%c\n",x,z);
}
else{
move(n-1,x,z,y);//将n-1个盘子从x借助z移动到y上
printf("%c-->%c\n",x,z);//将n个盘子从x移到z上
move(n-1,y,x,z);//将n-1个盘子从y借助x移动到z上
}
}