这个程序2为什么是最后为123?

img


程序一我懂了 但是程序二没搞懂写错了能否解释一下为什么最后输出了123

这是个闭包函数,也就是递归调用,当满足n < 10时,才执行打印语句,所以第一个打印的是1,然后依次返回闭包保存的2、3。python 中闭包是可以保存中间递推值的。程序执行过程——

  • 程序执行输出:

    img

  • 把输出语句改为:


print(n, end='')

  • 就会是——

    img


     &emspn;后面返回的12、123是递推fun(n//10)保存的值

这是一道递归题,首先你要对数据结构中的栈有一定了解,栈的特点的先进后出,在这道题里面,程序输入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)剩下部分的代码

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7738831
  • 你也可以参考下这篇文章:编写程序,用户输入一个位以上的整数,输出其百位以上的数字。例如用户输入1234.则程序输出12.
  • 除此之外, 这篇博客: 上机作业111中的 构造一个单链表,分别实现在表头、表中插入新元素的操作,并输出该单链表。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 提示:完整的程序包括程序前缀、单链表的结构体类型定义、表尾插入新元素子函数、表头插入新元素子函数、表中插入新元素子函数、求链表表长子函数、输出子函数、主函数等。

    #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;
    }
    
  • 您还可以看一下 刘磊老师的计算机进制转换课程中的 其他进制转换为十进制小节, 巩固相关知识点