迭代法对数计算B的N次方 SICP 计算机程序的构造和解释 1.16

使用Scheme的对数迭代法:

#lang racket

;;N是偶数:b^n = (b^(n/2))^2
(define (square x) (* x x));定义乘积函数
(define (fast-expt b n);筛选
  (expt-iter b n 1))
(define (expt-iter b n a)
  (cond ((= n 0) a);当n= 0,值为1
       ((even? n)(expt-iter (square b)(/ n 2) a));判断是否为偶数
  ((odd? n)(expt-iter b (- n 1)(* b a)))));判断是否为奇数
(define (even? n)
  (= (remainder n 2) 0))
(fast-expt 2 15)
;;N是奇数:b^n = b*b^(n-1)

Java实现的递归法和迭代法:

public class Test {
    public static void main(String args[]){
        int ex,ey;
        ex = expt(122,4);
        ey = expt_iter(122, 4, 1);
        System.out.println(ey);
        System.out.println(ex);
    }
    //递归
    static int expt(int b,int n){
        int sum;
        if(n == 0)
            return 1;
        else
        {
            sum = (expt(b,(n-1)))*(b);
            return sum;
        }
    }
    //迭代
    static int expt_iter(int b, int counter,int product){
        int sum;
        if(counter == 0){
            return product;
        }
        else
        {
            sum = expt_iter(b, (counter-1), (b*product));
            return sum;
        }
    }
}
时间: 2024-10-22 11:28:09

迭代法对数计算B的N次方 SICP 计算机程序的构造和解释 1.16的相关文章

SICP~计算机程序的构造和解释~ 1.12 c++实现

题目: 采用递归计算过程计算出帕斯卡三角形的各个元素. row:0        11       1 12      1 2 13     1 3 3 14    1 4 6 4 15   . . . . . .col: 0 1 2 3 4 //c++ //递归 #include<iostream> using namespace std; int pascaler(int row ,int col){ int value; if(col>row) { cout<<&quo

SICP 计算机程序的构造和解释 1.21 寻找因子 Scheme、C++实现

寻找素数因子 要求用书中的smallest-divisor过程找出199, 1999, 19999的最小因子. Scheme Code: 主要流程: 定义寻找素数的过程 如果2的平方即4,大于测试值,那么它肯定是素数 如果n能和2整除,那么不是素数,最小因子是2 如果不是,回到过程find-div,再试试能不能与2+1整除,循环 #lang racket (define (square x)   (* x x)) ;定义筛选 (define (smallest-div n)   (find-di

斐波那契算法的对数解法 计算机程序的构造和解释 习题1.19

程序由Scheme语言编写,待会上别的语言实现. #lang racket ;斐波那契对数法 ;筛选 (define (fib n) (fib-iter 1 0 0 1 n)) (define (square x) (* x x)) (define (fib-iter a b p q count) (cond ((= count 0) b);count = 0时,fib(1) = 0 ((even? count);如果是偶数,那么,p,q的值分别为 ;p = p^2 + q^2 ;q = 2pq

【算法】高效计算n的m次方

今天看到了一个非常好的算法,数学什么什么定理我不懂,但这算法值得我学习. 目的:计算n的m次方 int power(int n,int m) { int odd=1;//用来把剩下的数乘进去 while(p>1){ if((m & 1) != 0)odd*=n; else n*=n; p/=2; } return n*odd; }

AC日记——计算2的N次方 openjudge 1.6 12

12:计算2的N次方 总时间限制:  1000ms 内存限制:  65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样例输入 5 样例输出 32 提示 高精度计算 思路: 模拟: 来,上代码: #include<cstdio> using namespace std; int n; char s[101]; int main() { s[0]=1; scanf("%d",&n

六道题 : 1.设计一个函数,用来计算b的n次方 2.(n! = 1*2*3*4*...n) 3.(1! + 2! + 3! + 4! + ... + n!) 4.成绩 5. 数组中的元素逆序存放 6.九九乘法口诀

/* 设计一个函数,用来计算b的n次方 递归的2个条件: 1.函数自己调用自己 2.必须有个明确的返回值 */ #include <stdio.h> int pow2(int b, int n); int main() { int c = pow2(3, 2); printf("%d\n", c); return 0; } /* pow2(b, 0) == 1 pow2(b, 1) == b == pow2(b, 0) * b pow2(b, 2) == b*b == po

计算2的n次方的三种方法(C语言实现)

C代码如下: 1 #include <stdio.h> 2 3 int func1(int n) 4 { 5 return 1<<n; 6 } 7 8 int func2(int n) 9 { 10 11 if(n==0) 12 { 13 return 1; 14 } 15 16 return func2(n-1)*2; 17 } 18 19 int func3(int n) 20 { 21 int c=1, i; 22 for(i=0; i<n; i++) 23 { 24

UVa 10883 超级平均数(二项式系数+对数计算)

https://vjudge.net/problem/UVA-10883 题意: 给出n个数,每相邻两个数求平均数,依次类推,最后得到1个数,求该数. 思路: 演算一下可以发现最后各个数的系数就是二项式系数. 但是n太大,直接计算会溢出. 所以,这里要用对数计算.(cmath中的log默认以e为底) 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio>

汇编实验一——利用这3条指令计算2的8次方

安装dosbox 运行 DOSBox 0.74 (noconsole) 实验内容: 将下面3条指令写入2000:0开始的内存单元中,利用这3条指令计算2的8次方. mov ax,1 add ax,ad jmp 2000:3 原文地址:https://www.cnblogs.com/wszme/p/9192992.html