C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
typedef struct node int num ; struct node *next ; NODE ;
void printlist( NODE * l )
if ( l == NULL ) return ;
printlist( l -> next ) ;
printf( " %d ", l -> num ) ;
return ;

int main( int argc, char *argv[] )
NODE *p ;
NODE *temp ;
int n ;
int i ;
int num ;
printf( "\nHow many numbers do you want to enter? " ) ;
scanf( "%d", &n ) ;
p = NULL ;
for ( i = 1 ; i <= n ; i++ )
temp = ( NODE * ) malloc( sizeof( NODE ) ) ;
printf("\nPlease enter a number: ") ;
scanf( "%d", &num ) ;
temp -> num = num ;
temp -> next = p ;
p = temp ;

printf("\n\n") ;
printlist( p ) ;
return 0 ;

printlist函数是递归,所以只需要修改printlist函数即可
void printlist( NODE * l )
while(l!=NULL)
printf( " %d ", l -> num ) ;
l = l->next;

return ;


但是,由于你链表的创建是向链表头插入新元素,所以,当你输入1 2 3时,你创建的链表数据的顺序就是3 2 1(3是链表头的数据)。所以把递归改成循环后,打印的内容就是321了。
没改之前,因为是递归算法,只保证你输入的内容和打印的内容的顺序是一样的,但是这个时候是按照链表的逆序打印的。追问

如何才能实现 顺序 打印呢?

追答

因为链表只能向后指,所以如果用while的话,打印的顺序肯定和链表的顺序是一样的。
所以解决方法有3个
1 创建链表的时候采用尾部插入,这样的话,输入的顺序跟链表的顺序是一样的,自然用while打印时,输入和打印的顺序就一样的
2 再或者,就像推荐答案那样,把数据按照链表的顺序保存起来,再倒着打印出来,这样输入的顺序就和打印的顺序一样了
3 就是你的程序不变,采用递归的方法,打印出来的自然就是链表逆序。把printlist( l -> next ) ;放到printf( " %d ", l -> num ) ;后面就是链表顺序打印。

个人觉得如果链表创建方法不变得情况下,第3中方法最好,第2中方法只能算是投机取巧的方法,为了实现而实现。

参考技术A 程序中printlist实现的是倒序打印链表,改成非递归只要遍历链表,把数据存入数组,然后倒序打印数组即可。所以代码如下:
void printlist( NODE * l )

int k = 0, stack[256];
while(l)

stack[k++] = l->num;
l = l->next;

while(k)
printf(" %d ", stack[--k]);

以上是关于C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中加入至少一个普通用户的帐户的递归函数

讲一下c语言中递归函数的使用方法有哪些?

C语言中的函数要点(下)

C语言 编写递归函数

Python算法-爬楼梯与递归函数

Python算法-爬楼梯与递归函数