尹成版本汉诺塔递归和高级递归

来源:互联网 发布:vb调用大漠 编辑:程序博客网 时间:2024/05/17 07:40

一:递归

我输入一10进制数据,请把它转换成2进制

1:腾讯面试题,走50个台阶有多少种可能性

/*
递归的原理就是栈,递归的缺点是反复需要函数的调用,计算慢点。
*/
double go(int n)
{
if (n==1)
{
return 1.0;
}
else if (n==2)
{
return 2.0;
}
else{
return go(n - 1) + go(n - 2);

}
}
void main()
{
printf("结果有%f种可能:",go(3));
system("pause");
}

2:

//用数组的方式结合循环解答:数组和循环比递归快,但是后面会出现负数,越界了,溢出了,需要把int改成double

void main()
{
//printf("结果有%f种可能:",go(3));
int a[50];
a[0] = 1;
a[1] = 2;
for (int i = 2; i < 50;i++)
{
a[i] = a[i - 1] + a[i - 2];
printf("%d\n",a[i]);
}


system("pause");
}

应该改成:

void main()
{

double a[50];
a[0] = 1;
a[1] = 2;
for (int i = 2; i < 50;i++)//数组加递归 来实现递归
{
a[i] = a[i - 1] + a[i - 2];
printf("%f\n",a[i]);
}


system("pause");
}

3:阶乘


/*
1*2*3*4*5*6*7*8*9*10=10!阶乘,递归的2大条件,1为终止条件,如go(1),2为循环要素,例如第n个依赖于第n-1个
go(1)=1;go(2)=1*2;go(3)=1*2*3;
总结就是:go(n)=go(n-1)*n;
go(5)=go(4)*5=go(3)*4*5=go(2)*3*4*5=go(1)*2*3*4*5;go(1)是终止条件
*/
int go(int n)
{
if (n==1)
{
return 1.0;
}

else{
return go(n - 1)*n;

}
}
void main()
{

printf("%d", go(5));
system("pause");
}

4:汉若塔

汉诺塔:

分析3个步骤:
1:将A上n-1个盘借助C座先移到B座上。
2:把A座上剩下的一个盘移到C座上。
3:将n-1个盘从B座借助A座移到C座上。




/*
推理次数:go(n)=2*go(n-1)+1;
推理步骤:hanoi(n-1,A,C,B);//A->B,先把A盘上的n-1个盘移动到B盘,辅助C盘
printf("%c->%c\n",A,C);
hanoi(n-1,B,A,C);//B->C,B盘上的n-1移动到C盘,辅助A盘
*/
int goci(int n)
{
if (n==1)
{
return 1;
}

else{
return 2*goci(n - 1)+1;

}
}
//设计递归函数,实现模拟移动的步骤
//ABC  A->C:C为辅助盘,B就是我们要移动的盘
void hanoi(int n,char A,char B,char C)//设计4个参数
{
if (n==1)//当n=1,只有一个盘子的时候怎么做
{
printf("%c->%c\n",A,C);
}
else//当n不等于1的时候怎么做?
{
hanoi(n-1,A,C,B);//A->B,先把A盘上的n-1个盘移动到B盘,辅助C盘
printf("%c->%c\n",A,C);
hanoi(n-1,B,A,C);//B->C,B盘上的n-1移动到C盘,辅助A盘
}
}
void main()
{
int n;
scanf_s("%d",&n);
//分别实现求次数还有步骤.次数:go(n)=2*go(n-1)+1;
int ci = 0;//一开始让cishu=0,然后实现递归运算
ci = goci(n);
printf("%d个盘子需要%d次",n,ci);
printf("步骤如下\n");
hanoi(n,'A','B','C');//变成的时候注意细节,严谨
system("pause");
}

0 0
原创粉丝点击