1//河内塔
2#包含ltstdio.hgt
3voidhanoi(intn,chara,charb,charc)//这里代表通过b列将a列上的板块移动到c列。
4{if(1n)//如果是板块,直接把a列上的板块移到c。
5{
6printf(
递归的思想主要是为了能够重复一些动作,比如简单的阶乘、幂、回溯中的八皇后、数独以及汉诺塔和分形。
由于堆栈的机制,一般递归可以将一些变量保留在历史状态,比如你提到的r:北部
返回1
返回x*幂(x,n-1)
电源(3,3)
3*幂(3,2)
3*(3*幂(3,1))
3*(3*(3*幂(3,0)))
3*(3*(3*1))这里n0,返回1
3*(3*3)
3*9
27
当函数参数n0时,它开始后退~直到第一次召唤力量结束。
基本的例子不用递归就能解决,一般来说就是问题在最小尺度上的解。比如斐波那契数列递归,f(n)f(n-1)f(n-2),基例是1和2,f(1)和f(2)的结果都是1。再比如:汉诺塔递归,基例是一个盘子的情况,你只需要移动一次,而且必须有一个基例没有递归,否则就是一个无法退出的递归。
河内塔:河内塔的问题河内塔是一种教育玩具,起源于一个古老的印度传说。
当上帝创造世界时,他造了三根钻石柱子。在一根柱子上,从下到上依次叠放着64个金盘。
上帝命令婆罗门按照从下到上的大小顺序重新排列另一根柱子上的圆盘。
还规定小盘不能放大盘,一次只能在三根柱子之间移动一个盘。
假设木柱上有一个圆盘,只需要移动一次。
假设木柱上有两个圆盘,需要移动三次(a-c,a-b,c-b)。
假设木柱上有三个圆盘,需要移动七次。
a-ba-c
b-c
a-b
c-a
c-b
a-b
假设木柱上有n个圆盘。
其实是有规律的。
从一根针向上移动到另一根针,并且始终保持向上小和向下大的顺序。
需要递归方法,移动次数为f(n)。显然,f(1)1,f(2)3,f(3)7,f(k1)2*f(k)1。
不难证明f(n)2n-1。
然后f(5)25-132-131次