评论

收藏

[C++] 【C语言】习题---递归函数

编程语言 编程语言 发布于:2021-12-15 19:53 | 阅读数:438 | 评论:0

1.递归常见错误
【栈溢出】stack overflow
(1)局部变量、函数形参存放于栈区
​​(2) ​​​​Stack Overflow​​
2.递归习题
1.接受一个整形值,顺序打印它的每一位
(1)如 输入1234 ,打印出1 2 3 4
(2)步骤

  • //打印123 4
  • //打印12 3 4
  • //打印1 2 3 4
(3)每次打印最右位的数
void print(int n){  if(n>9)  //n>9,则至少是两位数  {  print(n/10);  }   printf("%d  ",n%10);}int main(){  unsigned int num=0;  scanf("%d",&num);//1234  //递归  print(num);  return 0;}
2.求字符串长度,不允许创建临时变量
(1)字符串末尾隐含‘\0’
(2)*str++表示数组str[ ]的首元素后移一位
int length(char* str){  int count=0;  while(*str!='\0')  {  count++;  *str++;//地址+1  }   return count;}int main(){  char arr[]="abc";  int len = length(arr);  printf("len=%d",len);  return 0;}
3.求n的阶乘
递归、非递归均可做
int function(int n){  int i=0;  int ret=1;  for(i=1;i<=n;i++)  {  ret=ret*i;  }  return ret;}int main(){  int ret=0 ;  int n=0;  scanf("%d",&n);  ret=function(n);  printf("%d",ret);}
4.求第n个斐波那契数列
前两个数之和等于第三个数:1 1 2 3 5 8 13 21 34 55------
  Fib(n-1)+Fib(n-2)
int Fib(int n){  if(n<=2)  return 1;  else  return Fib(n-1)+Fib(n-2);}int main(){  int n=0;  int ret=0;  scanf("%d",&n);  ret=Fib(n);  printf("%d\n",ret);}
5.汉诺塔问题
问题描述:a,b,c三个柱子,a柱上有n个盘子(上面小,下面大),请借助b柱子,把a柱子上的盘子移动到c柱子上,移动过程中要求始终保持:上面的盘子小,下面的盘子大。
关键:借助b柱子,每次把a最下面的盘子移到c柱子上
VS /test15








关注下面的标签,发现更多相似文章