/**********************************/
//程序题目:汉诺塔理解递归的含义
//程序员:王东-WD
//编程时间:2016-7-9
//程序功能:利用递归实现汉诺塔的解法
/**********************************/
#include "stdafx.h"
void Hanoi(int n,char a,char b,char c);
void Move(int n,char a,char b);
int _tmain(int argc, _TCHAR* argv[])
{
int n;
printf("input the number of disks:");
scanf("%d",&n);
printf("setps of moving %d 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)
{
static int j=1;
printf("第 %d 步:",j++);
printf(" Move %d :form %c to %c \n",n,a,b);
}
//思考1:虽然可以借助把N-1看做整体的方法来解决这个问题,但是还是不能深刻理解盘子在移动的规律,简单说就是没有计算机程序这个怎么做。
//思考2:递归是自己调用自己,然后从一个固定的截至条件向前推理,这是个办法。但是谁能保证可以推的通, 万一没有推的通呢?
//思考3:递归和迭代是怎么转化的?
//思考4:深入理解递归的表现格式和内在流程。
迭代与递归的区别
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. A—–>A
一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。
使用递归要注意的有两点:
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.
利用递归可以解决很多问题:如背包问题,汉诺塔问题,…等.
斐波那契数列为:0,1,1,2,3,5…
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2);
int fib(int n)
{
if(0 == n)
return 0;
if(1 == n)
return 1;
if(n > 1)
return fib(n-1)+fib(n-2);
}
上面就是一个简单的递归调用了.由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低.
迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B. A------>B
递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.
//这是递归
int funcA(int n)
{
if(n > 1)
return n+funcA(n-1);
else
return 1;
}
`
``//这是迭代
int funcB(int n)
{
int i,s=0;
for(i=1;i<n;i++)
s+=i;
return s;
}
“`