【问题标题】:Help me translate this Java to Scheme to get things going in my head帮我把这个Java翻译成Scheme,让事情在我的脑海中进行
【发布时间】:2011-11-09 16:56:35
【问题描述】:

我正在学习 Scheme,并且我已经阅读了基础知识,但我仍然不知道如何将 Java 类“映射”到 Scheme 代码。你们中的任何人都可以帮我吗?我只需要有人向我展示这在 Scheme 中的样子,以掌握最终的细节并让事情发生在我的脑海中:

public class sumFibonacciValues {
    public static void main(String [] args) {
        int n = 4000000;
        long i2 = 1, i1 = 1, Fibo = 0, temp = 1;
        while(i2 < n) {
            temp = i1 + i2;
            i1 = i2;
            i2 = temp;
            if(i2 % 2 == 0)
                Fibo += i2;
        }
        System.out.println(Fibo);
    }
}

【问题讨论】:

  • SO 不是代码生成机器。
  • 我不是要求生成代码,我要求的是代码翻译。我可以编写自己的代码,但从来没有写过我在 Scheme 中发布的任何东西,我希望得到一些帮助来弄清楚这应该如何进行。
  • 我怀疑直接“有状态”映射到 Scheme 是可能的,但是这个程序的惯用 Scheme 实现看起来会非常非常不同。我的 Scheme 技能生疏了,所以恐怕我无法提供答案,但请注意。
  • 制作rosettacode.org/wiki/Fibonacci_sequence#Scheme。 literateprograms.org 现在已经消失了。

标签: java scheme code-translation


【解决方案1】:

我不会回答看起来很像家庭作业的问题,但“惯用的”评论只是乞求证明它真的没那么远。一、直接翻译:

(define (sum-fibonacci-values)
  (define n 4000000)
  (define i2 1)
  (define i1 1)
  (define fibo 0)
  (define temp 1)
  (let loop ()
    (when (< i2 n)
      (set! temp (+ i1 i2))
      (set! i1 i2)
      (set! i2 temp)
      (when (zero? (modulo i2 2)) (set! fibo (+ fibo i2)))
      (loop)))
  (write fibo))

其次,通过删除多余的突变,使其“惯用”,而只是绑定新值,并使用尾递归循环。请注意,此代码仍与原始代码直接相关:

(define (sum-fibonacci-values)
  (define n 4000000)
  (let loop ([i2 1] [i1 1] [fibo 0] [temp 1])
    (if (< i2 n)
      (let* ([temp (+ i1 i2)]
             [i1 i2]
             [i2 temp]
             [fibo (if (zero? (modulo i2 2)) (+ fibo i2) fibo)])
        (loop i2 i1 fibo temp))
      fibo)))

最后,现在代码更清晰了,您可以看到有一些冗余。这是一个清理后的版本:

(define (sum-fibonacci-values)
  (define n 4000000)
  (let loop ([i2 1] [i1 1] [fibo 0])
    (if (< i2 n)
      (let ([i3 (+ i1 i2)])
        (loop i3 i2 (if (zero? (modulo i3 2)) (+ fibo i3) fibo)))
      fibo)))

请注意,可以对 Java 代码进行相同的清理。 (但这真的留给读者作为练习......)

【讨论】:

  • 您的回答准确符合 Luis Armando 将 Java 映射到 Scheme 的要求,希望对他学习 Scheme 有所帮助。但是,我认为值得指出的是,给定相同的任务(似乎是对前 n 个偶数斐波那契数求和)并且没有 Java 实现开始,生成的 Scheme 代码可能会有所不同,这就是我尝试的重点用我的“惯用”评论来制作。不过,我承认这可能超出了 Luis Armando 的要求。
  • 我知道这看起来像家庭作业问题,但我不能向你保证,我只是想要一个需要一些有趣思考的例子,我首先想到的是这段代码几个月前写的。谢谢你,它真的帮助我了解了如何使用 Scheme =)
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 2021-02-03
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多