欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2020-12-10

程序员文章站 2022-05-08 22:19:39
...

递归思想

原创思路

我自己也是刚开学 学习了两个月的小白,文章如有错误请各路大佬指出。写这篇文章时我也没有深度思考,可能会有点小瑕疵;

废话我也不多说,直接上代码。

#include <stdio.h>
#include <stdlib.h>
int fun(int i){
 if(i>0){
  fun(i/2);
 }
 printf("%d\n",i);
}
int main(){
 fun(8);
 return 0;
}

上面的代码是老师(我超级崇拜)留的一道作业题,运行的结果想必大家都知道,非常简单。

0
1
2
4
8

但是有没有想过这是怎么运行出来的,先来解释一下吧,当运行fun函数时每当 i>0 时都会执行fun函数,同时也会残留一个printf("%d\n",i)在外部;
我现在用代码实现这个思路:
我首先说明下面的代码运行结果是不对的

#include <stdio.h>
#include <stdlib.h>
int main(){
  int i=8;
  if(i>0){ 
    i=i/2;if(i>0){ 
       i=i/2;if(i>0){ 
          i=i/2;if(i>0){ 
            i=i/2;if(i>0){
                  i=i/2;
               }else printf("%d\n",i);
              }printf("%d\n",i);
          }printf("%d\n",i);
      }printf("%d\n",i);
  } printf("%d\n",i);
 
 return 0;
}

我想传达是一种思想,对于本题每次递归都会残留一个printf在外面,只有执行到你设定的条件时才可以运行下面的程序,也就是递归中的回溯。通过观察我们也可以看到你给的终止条件必须有效,不然它永远不会执行后面的程序,最终也不会给你答案

下面是可以运行正确的答案的代码,但是这段已经脱离我的本意了。

#include <stdio.h>
#include <stdlib.h>
int main(){
  int i=8;
  if(i>0){ 
  printf("%d\n",i);
   i=i/2;if(i>0){ 
   printf("%d\n",i);
    i=i/2;if(i>0){ 
    printf("%d\n",i);
     i=i/2;if(i>0){
     printf("%d\n",i); 
      i=i/2;if(i>0){
       i=i/2;
      }else printf("%d\n",i);
     }
    }
   }
  } 
 
 return 0;
}
相关标签: 递归法