2017-10-05 87 views
4

我用PHP和Java编写了一个程序,它生成长度为2的所有可能的单词。 我使用了递归。 为什么程序在Java中工作,但不在PHP中?这是相同的代码。为什么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); 
    } 
} 
} 
+1

什么'PHP'程序打印给定输入? – pleft

+0

我不熟悉php的第一行是否生成,并且你声明了变量?你在.php文件中工作吗?我没有太多的工作在这里,我只是想看看你是否看到了基本知识 – Tomm

+0

在PHP中:它打印所有可能的单词,直到长度为4.然后它停在YZYZ。但它应该停止在ZZ –

回答

5

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

更改您的循环
foreach (range('A', 'Z') as $c){ 

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

编辑

对不起,我试着找到关于这个的官方文件,但我不能。所以我会尝试解释一点

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

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

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

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

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

它的罚款,直到$ C = 'Z',而是$ C之后++将是 'AA' 当PHP开始进行比较, 'AA' <“ Z”和循环继续下去,这就是为什么我改变了环路

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

要使其工作

我希望你喜欢它,并高兴与我的解释,抱歉,因为我没有看到任何文件关于这一点,它只是如何PHP的工作,我知道我t

+1

您想解释为什么您的答案可以解决问题吗? –

+0

它工作!非常感谢你。 –

+0

SO并不是真正意义上的编码服务。如果你回答一个问题,试着教育OP了解发生了什么。不要只发布一些代码,没有别的! –

8

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

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

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

+0

至少这个答案解释了发生了什么,而不是只发布一些工作代码,没有更多! –

相关问题