SICP:1.31按照公式求Pi值,原理同1.29

#lang racket
;product doing the multiplation
(define (product term a next b)
  (if (< b a)
      1
      (* (term a)
     (product term (next a) next b))
   );if
  );product

(define (product-iteration term a next b)
  (define (iteration a result)
    (if (< b a)
    result
    (iteration (next a)
           (* result (term a));*
           );iteration
    );if
    );iteration
  (iteration a 1)
  );product-iteration

(define (get-pi n)
  (define a 1.0)
  (define (odd-num c)
    (+ 1 (* 2 c));+
    );odd-num
  (define (even-num c)
    (* c 2));even-num
  (define (term1 c)
    (/ (even-num c)
       (odd-num c));/
    );term1
  (define (term2 c)
    (/ (+ 1 (odd-num c))
       (odd-num c));/
    );term2
  (define (next c)
    (+ c 1));next

  (* 4
     (product-iteration term1 a next n)
     (product-iteration term2 a next n))
  );get-pi

(get-pi 1000)
(get-pi 10000)

时间: 2024-10-07 20:45:37

SICP:1.31按照公式求Pi值,原理同1.29的相关文章

nyist 31 5个数求最值

5个数求最值时间限制:1000 ms | 内存限制:65535 KB 难度:1描述 设计一个从5个整数中取最小数和最大数的程序输入输入只有一组测试数据,为五个不大于1万的正整数输出输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开.样例输入1 2 3 4 5样例输出1 5 #include <iostream>using namespace std;int main ( ){ int i,max,min,a[5] ; for(i=0 ;i<5 ;i++

NYOJ 31 5个数求最值

描述 设计一个从5个整数中取最小数和最大数的程序 输入 输入只有一组测试数据,为五个不大于1万的正整数 输出 输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开. 样例输入 1 2 3 4 5 样例输出 1 5 #include <iostream> #include <climits> using namespace std; int main() { int m; int max=INT_MIN; int min = INT_MAX; for

[数、运算] 蒙地卡罗法求 PI

题目说明: 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名.蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式. 题目解析: 蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值:假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1,如下图所示: 如果随意的在正方形中投射飞标(点)好了,则这些飞标(点)有些会落于四分

【蓝桥杯】历届试题 公式求值

  历届试题 公式求值   时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于1

蓝桥杯-历届试题-公式求值

历届试题 公式求值 时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于10%的数

《用C++语言编写一个程序,求PI的值》

1 //编写一个C++程序求PI的值 2 /* 3 PI=16arctan(1/5)-4arctan(1/239) 4 其中arctan用如下形式的极数计算: 5 arctan=x-(x^3/3)+(x^5/7)-(x^7/7)+... 6 */ 7 #include<iostream> 8 using namespace std; 9 double arctan(double x){ 10 double sqr = x*x; 11 double e = x; 12 double r = 0;

BZOJ 3000(Big Number-Stirling公式求n!近似值)

3000: Big Number Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 220  Solved: 62 [Submit][Status] Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数--N,K Output 每行一个数为输出结果. Sample Input 2 5 2 10 10 10 100 200 Sample Output 1 1 7 69 对

解剖被称为「外星人程序」的求PI小程序

|版权声明:本文为博主原创文章,未经博主允许不得转载. 原代码如下: 1 /*某年Obfuscated C Contest佳作选录:*/ 2 long a=10000,b,c=2800,d,e,f[2801],g; 3 main(){for(;b-c;)f[b++]=a/5; 4 for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 5 for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);} 输出: 3

hdu4521-小明系列问题——小明序列(线段树区间求最值)

题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE.线段树搞之就可以了,或者优化后的nlogn的dp. 代码为  线段树解法. 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cct