【问题标题】:Why does the same code for Java and PHP not work?为什么 Java 和 PHP 的相同代码不起作用?
【发布时间】:2018-03-16 16:43:49
【问题描述】:

我用 PHP 和 Java 编写了一个程序,它生成所有可能的长度为 2 的单词。 我使用了递归。 为什么程序在 Java 中可以运行,而在 PHP 中却不行?这是相同的代码。

Java

package com.company;


public class Words {
public static void main(String[] args) {
    generate("", 2);
}

static void generate(String prefix, int remainder) {
    if (remainder == 0) {
        System.out.println(prefix);
    } else {
        for (char c = 'A'; c <= 'Z'; c++) {
            generate(prefix + c, remainder - 1);
        }
    }
}
}

PHP

generate('', 2);

function generate($prefix, $remainder)
{
if ($remainder == 0) {
    echo "$prefix\n";
} else {
    for ($c = 'A'; $c <= 'Z'; $c++) {
        generate($prefix . $c, $remainder - 1);
    }
}
}

【问题讨论】:

  • PHP 程序为给定的输入打印什么?
  • 我不熟悉 php 中的第一行生成了什么,你声明了变量吗?您是否在 .php 文件中工作。我在这里没有太多工作要做,我只是想看看你是否看过基础知识
  • 在 PHP 中:它打印所有可能的单词,直到长度为 4。然后它在 YZYZ 处停止。但它应该停在 ZZ
  • 你的代码有效,我在writephponline.com 上试了一下,得到了这样的输出:i.imgur.com/zgtaxj4.png
  • 是的,但它应该停在 ZZ。就像Java一样。但它不会停止。

标签: java php recursion generator


【解决方案1】:

$c 在 PHP 中有字符串类型。与数字相比,++ 运算符的工作方式不同。

PHP 在处理字符变量而不是 C 的算术运算时遵循 Perl 的约定。例如,在 PHP 和 Perl 中,$a = 'Z'; $a++;$a 转换为 'AA',而在 C 中,a = 'Z'; a++; 将 a 转换为 '['('Z' 的 ASCII 值为 90,'[' 的 ASCII 值是 91)。请注意,字符变量可以递增但不能递减,即使如此,也仅支持纯 ASCII 字母和数字(a-z、A-Z 和 0-9)。其他字符变量自增/自减无效,原字符串不变。

来源:http://php.net/manual/en/language.operators.increment.php

【讨论】:

  • 至少这个答案解释了发生了什么,而不是仅仅发布一些工作代码,仅此而已!
【解决方案2】:

改变你的循环

for ($c = 'A'; $c <= 'Z'; $c++) {

foreach (range('A', 'Z') as $c){

=============================

编辑

对不起,我试图找到有关此的官方文档,但我找不到。所以我会试着解释一下

在php中,当你比较两个字符串时,系统会尝试比较第一个字符,然后是第二个......当第一个不同的字符出现时,比较运算符将停止

例子

$a = 'ABCDEZ';
$b = 'ABCEZZ';

字符串 $b 大于 $a 因为 $a 和 $b 开头的值 ABC 相同但 E(字符串 $b 的索引 3 中的值)大于 D(字符串的索引 3 中的值$a),它们不需要比较其他字符

在这个问题中,原来的循环是

for ($c = 'A'; $c <= 'Z'; $c++) {

在 $c = 'Z' 之前没问题,但在那之后 $c++ 将是 'AA' 并且当 php 开始比较它时,'AA'

foreach (range('A', 'Z') as $c){

让它发挥作用

我希望你喜欢它并对我的解释感到满意,抱歉,我没有看到任何关于此的文档,这就是 php 的工作原理,我知道

【讨论】:

  • 您想解释一下为什么您的答案可以解决问题吗?
  • SO 并不是真正的编码服务。如果您回答问题,请尝试让 OP 了解正在发生的事情。不要只发布一些代码而不发布其他任何内容!
  • 我更新了我的答案,抱歉花了这么长时间来解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2018-12-01
  • 1970-01-01
相关资源
最近更新 更多