这是个闭包函数,也就是递归调用,当满足n < 10时,才执行打印语句,所以第一个打印的是1,然后依次返回闭包保存的2、3。python 中闭包是可以保存中间递推值的。程序执行过程——
程序执行输出:
把输出语句改为:
print(n, end='')
这是一道递归题,首先你要对数据结构中的栈有一定了解,栈的特点的先进后出,在这道题里面,程序输入123后会调用fun(123)由于123>10,所以会调用fun(12),然后fun(123)进栈,因为12>10,所以会调用fun(1),再把fun(12)进栈,此时的进栈顺序是fun(123)fun(12)fun(1),所以最后依次执行fun(1),fun(12),fun(123)剩下部分的代码
提示:完整的程序包括程序前缀、单链表的结构体类型定义、表尾插入新元素子函数、表头插入新元素子函数、表中插入新元素子函数、求链表表长子函数、输出子函数、主函数等。
#include <iostream>
using namespace std;
typedef int ElemType;
//结构体类型定义
struct LinkNode {
ElemType data;
struct LinkNode *next;
};
//输出
//将链表L中的数据输出到屏幕上,其中L指向头结点
void print(LinkNode* L) {
LinkNode *p; //定义一个指针变量
p=L->next; //让p指向链表L的第一个数据
while(p!=0) {
cout<<p->data<<" "; //输出数据到屏幕上
p=p->next; //指针后移
}
cout<<endl;
}
//在以H为头指针的单链表表尾插入一个数据x
//&可以去掉
void Insert_tail(LinkNode*&H, ElemType x) {
LinkNode *t,*p; //定义指针
t=new LinkNode; //申请新结点空间
t->data=x; //向新结点中写入数据
t->next=0; //把空地址写入新结点中
p=H; //初始指向链表的头结点
//循环结束时p指向最后一个结点
while (p->next!=0) {
p=p->next;
}
p->next=t; //让尾结点的next指针指向新结点
}
//返回单链表L的长度
int Length_LinkList(LinkNode* L) {
LinkNode *p; //定义一个指针变量
int len=0; //定义一个计数器,用于累计结点个数
p=L->next; //让p指向链表的第一个结点
while(p!=0) {
len++; //计数器累计1
p=p->next; //p指针后移,即指向链表当前结点的后继结点
}
return len;
}
//在以H为头结点的单链表的头结点后面插入一个数据x
void Insert_head(LinkNode *&H,ElemType x) {
LinkNode *t; //定义指针
t=new LinkNode; //申请新结点空间
t->data=x; //向新结点中写入数据
t->next=0;
//顺序不能换
t->next=H->next; //把单链表的第一个结点的地址写入新结点中
H->next=t; //让头结点的next指针指向新结点
}
//在单链表L的第i个位置插入新元素x
int ListInsert_LinkList(LinkNode*&H, int i, ElemType x) {
//如果插入位置不合法
if(i<1 || i>Length_LinkList(H)+1) {
printf ("The position error! Not insert! \n");
return 0;
}
LinkNode *t,*p;//定义指针变量
t=new LinkNode;//申请新结点空间
t->data=x;//向新结点中写入数据
t->next=0;
p=H;//p初始指向链表的头结点
//p指向第i-1个结点
for (int j=1; j<=i-1; j++) {
p=p->next;
}
t->next=p->next;
p->next=t;
return 1;
}
int main(int argc, char* argv[]) {
LinkNode *H; //定义链表指针
H=new LinkNode; //申请空间
H->data=-1; //为成员变量数据赋值
H->next=0; //为成员变量指针赋值
ElemType num;
int count, pos;
cout<<"enter linklist elems:"<<endl;
while(1) {
cin>>num;
if (num==9999)
break;
else
Insert_tail(H, num); //构造一个线性链表
}
cout<<"The linklist elems:"<<endl;
print(H); //输出单链表
count=Length_LinkList(H); //统计元素个数
cout<<"The linklist elements amount:"<<count<<endl;
cout<<endl;
//表头插入元素
printf("Insert the head element: \n") ;
printf("Input new element: \n") ;
cin>>num;
Insert_head(H, num) ;
cout<<"The lst new linklist elements:"<<endl;
print(H);//输出新表
count=Length_LinkList(H);//统计元素个数
cout<<"The lst new linklist elements amount: "<<count<<endl;
cout<<endl;
//表中插入元素
printf("Insert the new element: \n") ;
printf("Input the position: \n");
cin>>pos;
printf("Input new element: \n");
cin>>num;
//ListInsert_LinkList (H, pos, num);
if(ListInsert_LinkList(H, pos, num)==1) {
cout<<"The 2nd new linklist elements:"<<endl;
print(H);//输出新表
count=Length_LinkList (H);//统计元素个数
cout<<"The 2nd new linklist elements amount: "<<count<<endl;
}
return 0;
}