liuxing167756 所说是正解:(本质就是计算斐波那契数列)
从事资阳服务器托管,服务器租用,云主机,网络空间,域名注册,CDN,网络代维等服务。
fun 这个无返回值函数需要依靠 f1 ,f2 两局部变量用来传递每一次调用的结果地址(局部变量在堆栈中),每次调用都会不一样。最后的返回值是靠*S来传送的。这种用法在返回值很多时常用。多值可以用数组指针,可以用结构指针。之所以这样用 因为 fun(n) = fun(n-1) + fun(n-2) 对推公式中需要两个不同的返回值!更简单的公式如:fun(x)=fun(x-1)+5 可以直接用带返回值得函数递归形式。任何递推公式都可以用递归实现,递归转递推就不一定了。递归的优点是形式简单执行效率低,内存资源消耗大。
根据题意是:
fun(0) = 1;
fun(1) = 1;
fun(n) = fun(n-1) + fun(n-2).
就是斐波那契数列
n 0 1 2 3 4 5 6
x 1 1 2 3 5 8 13
由于是递归调用,所以,程序在打印结果的时候是从最内层函数开始打印,于是,就得到136.因为递归调用其实是嵌套调用,只是嵌套的是函数自身。这样,需要将最内层的函数执行完毕,才开始执行外层的,一层一层往外执行完毕,最后是main函数。若将递归还原为顺序程序,流程是这样:楼主得到的631其实是从6开始被存放到某堆栈中的,这样,1便成为最顶上的数,而6成为最底部的数。而最后打印的时候,需要弹栈,出栈顺序为:自顶向下出栈,于是,得到的结果为136楼主的解题过程是对的,但可能没理解递归的意义。建议楼主翻阅关于递归的相关文章看看。
举一个用递归调用函数求输入非负整数的阶乘的例子,如下:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
int fact(int n){
if(n==1 || n==0) return 1;
else return n*fact(n-1);
}
int main(void){
int x;
while(1){
printf("Input x(int 12=x=0)...\nx=");
if(scanf("%d",x),x=0 x=12)//x12时会使结果溢出
break;
printf("Error,redo: ");
}
printf("%d! = %d\n",x,fact(x));
return 0;
}
这是汉诺塔吧。
原理:(总共n个盘子)
1、将第一个位置(起始位置)上的n-1个盘子移到第二个位置上,此时第一个位置只剩第n个盘子
2、将第一个位置上的最后一个盘子(第n个盘子)移到第三个位置(目标位置)上,再将第二个位置上的n-1个盘子移到第三个位置上。
你不需要晓得n-1个盘子如何从一个位置移到另一个位置,让程序做。n--n-1--n-2......1,问题不断的小化,当n=1时,直接从第一个位置移到第三个位置,再倒过来推1--2--3......--n。最终问题就会被解决。
hanoi()函数就是将问题小化,使n--1
move()函数中char x是起始位置,char y是目标位置,即x--y.用A、B、C来显示盘子是如何移动的