函数程序运行输出结果,求原理

img

img


临考试画了重点,但是没有讲到这一节,有没有人可以帮忙讲一下原理,谢谢🙏

第3题

定义了全局变量 x 和 y, 在 num 函数中 使用了 extern x,y 就是外部定义的全局变量 x, y。extern 表示外部的。
打印之前调用了 num, num 中
x = a -b = 15 - 10 = 5
y = a + b = 25

所以打印为 5 , 25


第4题

调用 fun(132645)
-->fun(132645/100) * 10 + 132645%10 = fun(1326) * 10 + 5
-- --> fun(1326) 里 fun(1326/100) * 10 + 1326 % 10 = fun(13) * 10 + 6
-- -- --> fun(13) 里 13 < 100 所以 return 13 % 10 = 3
所以
fun(132645) 就可以写成 fun(1326) * 10 + 5 = (fun(13) * 10 + 6) * 10 + 5
= (3 * 10 + 6) * 10 + 5 = 36 * 10 + 5 = 360 + 5 = 365

修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。常用于全局变量或全局函数声明。
num函数里面用的xy就是main函数里面的xy

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7691877
  • 这篇博客也不错, 你可以看下有一个已排好序的数组,要求输入一个数后,按原来的规律插入数组
  • 除此之外, 这篇博客: 有一个已经排好序的数组,今输入一个数,要求按照原来排序的规律将它插入数组中中的 有一个已经排好序的数组,今输入一个数,要求按照原来排序的规律将它插入数组中 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 假设原数组是按照升序进行排序,那么需要将输入的值进行挨个比较,从第一个数开始,若小于输入的数,则和下一个数比较,直到大于输入的数,则将输入的值放在该位置,从大于他的数起往后移一位。

    #include<stdio.h>
    int main()
    {
    	int a[10]={1,3,5,7,9,11,13,15,17,19};
    	int i,j,p;
    	printf("原数组为:\n");
    	for(i=0;i<10;i++)
    	printf("%3d",a[i]); 
    	printf("\n输入要插入的数:\n");
    	scanf("%d",&p);
    	for(i=9;i>=0;i--)//比较选择放置的位置 
    	{
    		j=i+1;
    		if(p>a[i])
    		{
    		a[j]=p;
    		break;}
    		else
    		a[j]=a[i];
    	}
    	printf("输出插入之后的序列:\n"); 
    	for(i=0;i<=10;i++)
    	printf("%d ",a[i]);
     } 
    

    在这里插入图片描述

  • 您还可以看一下 钱兴会老师的从零开始自然语言处理课程中的 自然语言处理的工作原理小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    该程序包含两个部分:

    1.斐波那契数列的计算:

    该部分程序采用两种方法实现斐波那契数列的计算,一种为非递归算法,一种为递归算法。

    斐波那契数列定义:

    斐波那契数列定义如下:

    $$f(1) = f(2) =1 , n>=3,f(n)=f(n-1)+f(n-2) $$

    斐波那契序列的前几个数为:

    1、1、2、3、5、8、13、21、34、55……

    其中,非递归算法如下:

    int Fibonacci_1(size_t n)//注意返回值可能会很大,但c语言中最大整数为4294967295
    {                        //测试后只能计算前46个斐波那契额数列
        int  first,second,third;//非递归算法
        int i;
        first=0;
        second=1;
        if(n<=2)
        {
            return 1;
        }
        for(i=2; i<=n; i++)
        {
            third=first+second;
            first=second;
            second=third;
        }
        return third;
    }
    

    而递归算法如下:

    int Fibonacci_2(size_t n)//递归算法
    {
        if(n<=2)
        {
            return 1;
        }
        else
            return Fibonacci_1(n-1)+Fibonacci_1(n-2);
    }
    

    其中,非递归算法的时间复杂度为$O(n^2)$,而递归算法的时间复杂度为$O(2^n)$,所以非递归算法的效率更高。

    2.创建无头结点的单链表并输出

    该部分程序实现的是创建无头结点的单链表,实现了链表节点的添加,并最终输出链表的值以及链表的长度。

    其中,创建无头结点的单链表的函数代码如下:

    struct  node* create()
    {
        int n;
        struct node* p, * head, * end;
        head = end = NULL;
        do {
            scanf("%d", &n);
            if (n != -1)
            {
                p = (struct node*)malloc(sizeof(struct node*));
                p->data = n;
                p->next = NULL;
                if (end == NULL)
                {
                    end = p;
                }
                else
                {
                    p->next = head;//添加新节点
                }
                head = p;
            }
        } while (n != -1);
        return head;
    }
    

    其中,scanf()函数是用来输入整数的,而当输入整数为-1时代表结束。

    最后,整个程序的主函数的代码如下:

    int main()
    {
        size_t n = 40;
        printf("非递归算法第%d个斐波那契数为>:%d\n", n, Fibonacci_1(n));
        printf("递归算法第%d个斐波那契数为>:%d\n", n, Fibonacci_2(n));
        struct  node* S;
        S = create();
        out(S);
        printf("\n%d", len(S));
    
        return  0;
    }
    

    其中,对于斐波那契数列的计算使用了非递归算法计算出了第40个斐波那契数,并将结果输出;而对于创建链表则使用了程序中的create()函数来创建无头结点的单链表,并最终输出链表的值以及链表的长度。