编写递归程序要点:
数值问题,可以表达为数学公式, 从数学公式推导出问题的 递归定义,然后确定问题的边界条件,从而确定递归的算法和递 归结束条件。因此,数值类问题最重要的是求出 $f(x)$和$f(x-1)$之间的关系;
比如阶乘问题:
$$ \mathrm{jiecheng}(n) = \begin{cases} 1 & n=0,或者,n=1 \ n \times \mathrm{jiecheng}(n-1) & n \ge 2 \end{cases} $$
根据数学公式可以很容易地写出程序代码:
float JieCheng(int n)
{
float f = 0;
if(n < 0)
printf("n<0,error!");
elseif(n = 0 || n = 1)
f = 1;
else
f = n * JieCheng(n-1);
return f;
}
在一块板上有三根杆,最左边的A杆上自上而下、由小到大放了 n个圆盘,要将A杆上的圆盘,借助最右边的B杆,全部移到中间的C 杆上,条件是一次仅能移动一个盘,且不允许大盘放在小盘的上面
因此,汉诺塔问题的解决思路是:
move(one, three
);hanoi(n-1, one, three, two)
;move(one, three)
;hanoi(n-1, two, one, three)
;程序的伪代码为:
hanoi(n, one, two, three)
{
if(n==1) move(one, three);
else
{
hanoi(n-1, one, three, two);
move(one, three);
hanoi(n-1, two, one, three);
}
}
从上面的分析可以看到,对于非数值类问题,如果能够找到解决这类问题的一系列操作步骤,就可以解决这样的问题。
/*将盘从getone 移动到putone*/
void move(char getone, char putone)
{
printf("%c--->%c\n",g ,p etone,putone);
}
/* 将n个盘从one杆,借助two杆,移动到three杆 */
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
int main()
{
int m;
printf("Input the number of disks:");
scanf("%d",&m); (
printf("The steps to moving %3d disks:\n",m);
hanoi(m,'A','B','C');
return 0;
}
分析:
思路:
如何将问题缩小以及如何控制递归的结束是两个最重要的问题!
反向输出(整数 n)
{
if(n >=10)then
{
输出最后一位;
n 除以10取整得 n_(n-1);
调用反向输出 n_(n-1);
}
else
输出 n;
}
int main()
{
int x;
void int_turn(int);
printf(“\nEnter N=”);
scanf(%d”,&x);
int_turn(x); /*函数调用*/
return 0;
}
void int_turn(int n)
{
if(n>=10) /*递归判断条件*/
{
printf(“%d ”,n%10); /*输出当前的最后一位*/
int_turn(n/10); /*原问题缩小,递归调用自身*/
}
else
printf(“%d”,n)