精华内容
下载资源
问答
  • 反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是...

    反向计算:编写一个函数将一个整型转换为二进制形式

    反向计算问题,递归比循环更简单

    分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数。


     
     
    十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
    具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
    对于数值n,二进制最后一位=n%2;计算得到的结果是最后要输出的结果,使用递归函数,联系递归的特点:在递归语句之前计算n%2,在递归调用语句之后输出结果,这样先计算的结果反而在最后输出。

     

    使用了10进制转2进制的反复相除,余数倒置法;

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 void toBinary(unsigned long);
     4 int main()
     5 {
     6     unsigned long num;
     7     printf("输入一个正整数:q退出\n");
     8     while(scanf_s("%ul", &num) == 1)
     9     {
    10         toBinary(num);
    11         putchar('\n');
    12         printf("输入一个正整数:\n");
    13     }
    14     system("pause");
    15     return 0;
    16 }
    17 //递归函数
    18 void toBinary(unsigned long num)
    19 {
    20     int r;
    21     r = num % 2;//最后一位要输出的,即使参数=1,还是要计算到这里结束,只取出余数就ok了。然后顺次返回上一级主调函数,继续执行剩下的……
    22     //如果商 1 / 2 = 0,计算就可以终止了,不需要再算
    23     if (num >= 2)
    24     {
    25         //精华,联系10进制转2进制的算法,每次除以2,取出余数,然后用新的商继续除以2,取出新余数……直到商为0,余数逆序输出即可
    26         toBinary(num / 2);//把新的商作为参数递归调用
    27     }
    28     //在递归语句之后输出,这样就是倒叙输出
    29     printf("%d", r);
    30 }

    当然使用位操作,也能实现这个算法:

    //将无符号十进制数转化为标准16位二进制数
    int main()
    {
        unsigned short i;
        
        cout << "请输入一个小于65536的正整数" << endl;
        cin >> i;
        //for语句从15递减到0,一共16次对二进制数的每一位的判断作操作。
        for(int j = 15; j >= 0; j--)
        {
            //<<运算表示把1的二进制形式整体向左移j位,左移后低位补0,移出的高位部分被舍弃。
            if (i & (1 << j)){
                //i&(1<<j)的值相当于把i的二进制的第j位取出来(i的第j位与(1<<j)的第j位与,i的第j位为1时值为真)循环后既得i的二进制形式。
                cout << "1";
            }
            else{
                cout << "0";
            }
        }
        
        cout << endl;
        
        return 0;
    }

    <<运算表示把1的二进制形式整体向左移j位,左移后低位补0,移出的高位部分被舍弃。

    例如,当j为15时,表达式(1<<j)的值为1000000000000000;当j为10时,值为0000010000000000。

    位运算的“个性”决定了它直接对数据的二进制形式进行操作的快捷性(一般计算机的数据存储基本形式为二进制形式),两个相同算法的程序,用了位运算后会使程序速度上有提高。

    使用现成的转换函数也是可以的

    _itoa(120, &buffer, 16); 第一个参数是要转换的数,第二个是地址,第三个是进制数

    再次看递归的优缺点

     

    优点:为一些编程问题提供了简单的办法,比如上题还有斐贝纳契数列问题等,二个数字是1,其余的每个数字都是前两个数字的和。这使用递归很好。

    缺点:占据内存大,耗资源,速度慢,一般难以维护和阅读。比如斐波纳契数列递归函数:

    斐波那契数列问题

    问题的由来:13世纪的意大利数学家斐波纳契(Fibonacci)写了一本商用的算术和代数手册<<Liber abaci>>。在这本书里,他提出了这么一个有趣的问题:

    假定一对兔子在它们从出生整整两个月以后可以生一对小兔子,其后每隔一个月又可以再生一对小兔子。假定现在在一个笼子里有一对刚生下来的小兔子,请问一年以后笼子里应该有几对兔子?

    让我们仔细地算一下。

    第一、第二个月,小兔子长成大兔子,但还没成熟不能生小兔子,所以总共只有一对。

    第三个月,原有的一对大兔子生了一对小兔子,现在一共有二对了。

    第四个月,大兔子又生了一对小兔子,但是第二代的那对小兔子还没成熟,还不能生小兔子,所以总共有三对。

    第五个月,第一、二两代的两对兔子各生了一对小兔子,连同四月份原有的三对,现在一共有五对了。

    第六个月,在四月份已经有的三对兔子各生一对小兔了,连同五月份原有的五对兔子,现在一共有八对了。

    依此类推,每个月份所有的兔子对数应该等于其上一个月所有的兔子对数(也就是原有的兔子对数)及其上上个月所有的兔子对数(这些兔子各生了一对小兔子)的总和。

    所以每个月的兔子对数应该是1、1、2、3、5、8、13、21、34、55、89、144、233……

    每一项都是前两项之和。因此,一年后笼子里应该有233对兔子

    这些兔子的数目我们称之为斐波纳契数字(Fibonacci numbers)。

    为方便起见,我们用 Fn表示第 n 代兔子的数目。

    我们观察到:

    F1=F2=1

    而当n≧3时,Fn=Fn-1+Fn-2

    最简单,但是时间复杂度最大的解法是递归算法, 算法时间复杂度O(n^2)

    long long fibonacciRecursion(unsigned int n ){
        if (0 == n){
            return 0;
        }
        else if (1 == n){
            return 1;
        }
        else{
            return fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2);
        }
    }

    注意:c和 c++中所有函数的地位平等,都可以调用其他任何函数的同时,被其他任何函数调用。比如,main虽然是程序入口函数,但是main也可以递归,或者被其他函数调用,只不过不经常这样做。

    下面分析一下这个递归解斐波那契数列的过程。以 f(10)为例子,想求 f(10),就要求 f(9)和 f(8),同理,求 f(9),先求 f(8)和 f(7)……使用递归树来表示:

     

    发现这是一个双重递归,即每次函数对本身进行了两次调用(不是一次调用一次,而是每次递归对自己调用两次),这样出现了指数变量阶的问题,就是每次递归调用产生的变量集合是指数阶增长的,如递归树所示,很多结点是重复计算的,是浪费的。这样就很容易程序崩溃。这是一个典型极端例子,提醒我们要谨慎使用,结合效率。

    改进的办法很自然就是避免重复计算

    可以把中间的结果,提前保存起来,以备后用,下次计算的时候直接使用,无需重复计算。使用迭代递推的方法。

    //递推的解法,非递归
    long long fibonacciRecursion(unsigned int n ){
        //先判断 n=0和1的时候
        if (0 == n){
            return 0;
        }
        else if (1 == n){
            return 1;
        }
        else
        {
            long n0 = 0;
            long n1 = 1;
            long fn = 0;
            for (int i = 2; i <= n; i++){
                fn = n1 + n0;
                n0 = n1;
                n1 = fn;//这是递推的过程
            }
            
            return fn;
        }
    }

    算法时间复杂度O(n),很容易理解,也是很实用的解法。在实际开发中,不会使用第一种递归解法,因为效率很低,而第二种方法(也激素迭代),把递归用循环处理,极大的提高了时间效率。比较常用。

    一些关于斐波那契的变种

    问:一只青蛙一次可以跳上一级台阶,或者一次跳上两级台阶,求该青蛙跳上一个n 级的台阶总共有多少种跳法?

    分析;

    如果只有一级台阶,那么一共一种跳法,两级台阶,那么一共两种跳法,假设有 n 级台阶,那么把跳法记为 f(n),当 n>2的时候,第一次跳的时候有两种选择,如果第一次只跳一级,此时跳法数为后面剩下的n-1级台阶的跳法数目,也就是为 f(n-1)种,如果第一次跳两级,此时跳法数目为后面剩下的n-2级台阶的跳法数目,也就是 f(n-2),故一共为f(n)=f(n-1)+f(n-2)种,其实就是斐波那契数列。

    问:用2x1的小矩形横放或者竖放去覆盖更大的矩形,请问用8个2x1的小矩形无重叠的覆盖一个2x8的大矩形,一共有多少种方法?

    把2x8的覆盖方法记为 f(8),第一个1x2的小矩形去覆盖大矩形最左边有两个选择,竖放或者横放,当竖着放的时候,右边还有2x7个小区域,这种情况下的覆盖方法记为 f(7),如果横着放,当1x2的小矩形横着放在左上角的时候,左下角必须也横着放一个1x2的小矩形,而在右边还有2x6的区域,这时的覆盖方法记为 f(6),因此f(8)=f(7)+f(6),这仍然是斐波那契数列。

     

    转载于:https://www.cnblogs.com/kubixuesheng/p/4385682.html

    展开全文
  • 个税计算工具网上有的是 这个工具可以通过所交的个人所得税反向计算 可以得到所交个税的工资 这个功能比较有意思!
  • 递归能更好的适用于反向计算(递归计算十进制转二进制)
  • 内涵VB源码,初学者使用,或给孩子玩的小游戏
  • 反向计算最大长度

    2016-04-16 19:36:00
    假设现在有物资H,该物资为采购件,H可用作生产成品A或者B,生产流程如下: H—G—F—D—C—A 这样的流程,从H到A,一共需要5步生产流程 H—K—M—B 从H到B,一共需要4步生产流程 H—E—C—A 从H到A,一共需要4步...
  • C语言通过递归实现反向计算

    千次阅读 2013-12-06 16:44:11
    分析:一般来讲,对于数值n,其二进制数的最后一位是n % 2,因此计算出的第一个数字恰好是需要输出的最后一位数字。我们使用一个递归函数实现,在函数中,首先在递归调 用之前计算n % 2的数值,然后在递归调用语句...

    问题:编写一个程序,将一个整数转换为二进制形式。

    分析:一般来讲,对于数值n,其二进制数的最后一位是n % 2,因此计算出的第一个数字恰好是需要输出的最后一位数字。我们使用一个递归函数实现,在函数中,首先在递归调 用之前计算n % 2的数值,然后在递归调用语句之后进行输出。这样,计算出的第一个数值反而在最后一位输出。为了得出下一个数字,需要把原数值除以2(相当于在十进 制下把小数点左移一位)。如果此时得出的数值是偶数,则下一个二进制位的数值是0;若得出的是奇数,则下一个二进制位的数值就是1。例如:5是奇数,因此最低位一定 是1,5/2的数值是2(整数除法),所以下一位值是0。这时已经得到了数值01。重复上述计算,即使用2除以2得出1,而1 % 2的数值是1,因此下一位值是1。这时得到的数 值是101。当被2除的结果小于2时,说明已计算至最后一位二进制位,因此此时停止计算。


    程序:
    #include <stdio.h>
    void to_binary(unsigned long);
    
    int main(void)
    {
    	unsigned long number;
    	printf("Enter an integer (q to quit): \n");
    	while (scanf("%ul", &number) == 1)
    	{
    		printf("Binary equivalent: ");
    		to_binary(number);
    		putchar('\n');
    		printf("Enter an integer (q to quit): \n");
    	}
    	printf("Done.\n");
    	return 0;
    }
    
    void to_binary(unsigned long n)
    {
    	int r;
    
    	r = n % 2;
    	if (n >= 2)
    	{
    		to_binary(n / 2);
    	}
    	putchar('0' + r);
    	return;
    }
    展开全文
  • 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。 Input 输入1个数N(1 ^18)。 Output ... 输出不是2 3 5 7的倍数的数共有...我因为计算wa了两遍,,,服了自己。。。

    给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
    Input
    输入1个数N(1 <= N <= 10^18)。
    Output
    输出不是2 3 5 7的倍数的数共有多少。
    Sample Input

    10
    

    Sample Output

    1
    
    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    
    int main()
    {
        ll n, a, b, c, d, s, ab, ac, ad, bc, bd, cd, abc, abd, bcd, acd, abcd;
        while(scanf("%lld", &n)!=EOF)
        {
            //printf("%lld\n", n);
            a = n/2, b = n/ 3, c = n/5, d= n/7;//记录有多少个数满足单个条件
            ab = n/6, ac = n/10, ad = n/14, bc = n/15, bd = n/21, cd = n/35;//记录有多少个数满足两个条件
            abc = n/30, abd = n/42, acd = n/70, bcd = n/105;//记录有多少个数满足三个条件
            abcd = n/210;//记录有多少个数满足四个条件
            s = n - (a + b + c + d) + (ab + ac + ad + bc + bd + cd) - (abc + abd + bcd + acd) + abcd;
            printf("%lld\n", s);
        }
        return 0;
    }
    //我服了我的计算能力

    一定要注意计算啊。。。我因为计算wa了两遍,,,服了自己。。。

    展开全文
  • 1.https://blog.csdn.net/abeldeng/article/details/79092962 (交叉熵反向求导计算过程) 转载于:https://www.cnblogs.com/liutianrui1/p/10643819.html

    1. https://blog.csdn.net/abeldeng/article/details/79092962 (交叉熵反向求导计算过程)

    转载于:https://www.cnblogs.com/liutianrui1/p/10643819.html

    展开全文
  • BP反向传播计算

    2019-07-31 14:58:59
     这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0....
  • DNN反向传播计算过程

    2020-11-11 17:41:51
    根据初始化参数,正向计算各个神经元输出 1.使用relu作为激活函数,如果输入值是小于等于,偏导将会是0,也就是不会更新梯度;如果输入是大与0,梯度是1 以LR为例,假设使用relu作为激活函数,继续学习。 很...
  • 可以说,一个神经网络的计算,都是按照前向或反向传播过程组织的。首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。后者我们用来计算出对应的梯度或导数。计算图解释了为什么我们用这种...
  • OpenCV计算反向投影

    千次阅读 2016-04-12 15:30:11
    反向投影概念的理解: 首先,对上图灰度图像(大小为320*240)计算灰度直方图并进行归一化(即把最大值限制为255), 直方图有5个bin,像素值的取值范围是0-51, 51-102, 102-153, 153-204, 204-255 如下图所示...
  • 前向计算 先放一个原始的数据矩阵,在计算机视觉里是图像。 Data=[abcdefghijklmnop] Data= \left[ \begin{matrix} a & b & c & d\\ e & f & g & h \\ i & j &...
  • RNN/LSTM反向传播计算细节

    万次阅读 2017-06-14 20:13:39
    本文将简要介绍循环神经网络(Recurrent Neural Network,RNN),以及RNN的前向计算和误差反向传播过程。 转载请注明出处:http://blog.csdn.net/u011414416/article/details/46709965 以下内容主要引自
  • 反向传播和计算

    2018-04-03 10:45:01
    计算图(computational graph)角度看BP(back propagation)算法,这也是目前各大深度学习框架中用到的,Tensorflow, Theano, CNTK等。参考【1】原文:...
  • 反向投影误差的计算

    千次阅读 2017-05-26 14:55:17
    通过上一讲3D-2D的位姿计算后,现在求取反向投影误差 首先通过cv::solvePnPRansac(pts3d,pts2d,K,Mat(),rvec,tvec,false,100,4.0,0.99,inliers);cv::solvePnPRansac( pts3d, pts2d, K, Mat(), rvec, tvec, false, ...
  • 反向传播梯度的计算

    千次阅读 2019-06-29 18:55:04
    适用pytorch中Variable()函数中的backward()自动计算梯度 手动实现梯度计算(缺点:计算网络复杂时容易出错,难以检查) # -*- coding: utf-8 -*- #@Time :2019/6/29 18:36 #@Author :XiaoMa import torch as t ...
  • 正向传播、反向传播和计算图 在实现中,只提供模型正向传播(forward propagation)的计算,即对输⼊计算模型输出,然后通过 autograd 模块来调⽤用系统自动生成的 backward 函数计算梯度。 基于反向传播(back-...
  • 计算图和反向传播

    2020-10-21 17:28:22
    什么是计算计算图被定义为有向图,其中节点对应于数学运算。 计算图是表达和评估数学表达式的一种方式。 例如,这里有一个简单的数学公式 - p = x + y Shell 我们可以绘制上述方程的计算图如下。 上面的...
  • 反向传播是利用解析的方式推导梯度的计算式,但由于NN网络复杂,容易推导错误;数值微分求梯度虽然更耗时,但结果一定基本是正确的;所以我们把两种梯度的值作差观察差距,验证BP计算的正确性。 # 2层网络,一个隐层...
  • BMex反向合约盈亏计算

    2020-10-14 20:58:50
    import os,sys import logging import numpy as np import pandas as pd pd.set_option('display.width', 1000) pd.set_option('display.max_rows', 500) ENTRY = 11440 POSITION = -500 LEVERAGE = 3 ...ST
  • Caffe学习笔记—Caffe反向传播计算

    千次阅读 2017-05-16 11:13:04
    CNN进行前向传播阶段点,依次调用每个Layer的Forward函数,得到逐层的输出,最后一层与目标函数比较得到损失函数,计算误差更新值,通过反向传播路径层达到第一层,所有的权值层在反向传播结束后一起更新。...
  • 评估单个页面的反向PageRank问题的并行计算
  • CNN反向传播计算过程 传统的神经网络是全连接形式的,如果进行反向传播,只需要由下一层对前一层不断的求偏导,即求链式偏导就可以求出每一层的误差敏感项,然后求出权重和偏置项的梯度,即可更新权重。 卷积神经...
  • 反向传播公式推导与计算图表示

    千次阅读 2018-08-23 15:06:30
    前向传导与反向传导的区别是前向传导是计算每一个输入对于每一个节点的影响(计算∂/∂X,其中X表示输入),反向传导计算每一个节点对于每一个输出的影响(∂Y/∂,Y表示每一个输出)之所以反向传播比前向传播计算...
  • 快速计算梯度的魔法--反向传播算法

    千次阅读 2017-06-16 15:40:59
    前向传递节点,反向传递梯度。 我们先从计算图的底部开始向上,逐个节点计算函数值并保存下来。这个步骤,叫做前向计算(forward)。 然后,我们从计算图的顶部开始向下,逐步计算损失函数对每个子节点的导函数,代入...
  • 神经网络计算导数的秘诀:计算图中的反向传播 参考网站:http://colah.github.io/posts/2015-08-Backprop/ 构建一个计算图 先以一个简单的公式为例: e=(a+b)*(b+1) 我们可以把这个公式分成两个部分:c=a+b和d=b+1,...
  • y是对应的标注值(0或1),ai为对应的预测概率, ai的log底取e方便后面计算 假设yi对应的职位[0, 0, 1],即a6为正确值,概率应最大,Loss=-loga6 使用Loss值反向传播更新参数W,Loss对W求导,链式法则,Loss对ai求导 * ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,403
精华内容 2,961
关键字:

反向计算